二叉树:总结篇!【需要掌握的二叉树技能都在这里啦】

文章目录

  • 前言
  • 二叉树理论基础
    • 二叉树理论基础
    • 二叉树的遍历方式
      • 深度优先遍历
      • 广度优先遍历
    • N叉树的遍历方式
    • 求二叉树的属性
      • 二叉树:是否对称
      • 二叉树:求最大深度
      • 二叉树:求最小深度
      • 二叉树:求有多少个节点
      • 二叉树:是否平衡
      • 二叉树:找所有路径
      • 二叉树:递归中如何隐藏着回溯
      • 二叉树:求左叶子之和
      • 二叉树:求左下角的值
      • 二叉树:求路径总和3
  • 二叉树的修改与构造
    • 翻转二叉树
    • 构造二叉树
    • 构造最大的二叉树
    • 合并两个二叉树
  • 求二叉搜索树的属性
    • 二叉搜索树中的搜索
    • 是不是二叉搜索树
    • 求二叉搜索树的最小绝对差
    • 求二叉搜索树的众数
    • 二叉搜索树转成累加树
  • 二叉树公共祖先问题
    • 二叉树的公共祖先问题
    • 二叉搜索树的公共祖先问题
  • 二叉搜索树的修改与构造
    • 二叉搜索树中的插入操作
    • 二叉搜索树中的删除操作
    • 修剪二叉搜索树
    • 构造二叉搜索树
  • 最后总结

前言

不知不觉二叉树专题已经刷了30多道经典题目。

在每一道二叉树的题目中,我们都使用了递归三部曲来分析题目,相信大家以后看到二叉树,看到递归,都会想:

1. 返回值、参数是什么?
2. 终止条件是什么?
3. 单层逻辑是什么?

下面我们把分析过的题目分门别类,可以帮助大家循序渐进学习二叉树,也方便快速复习,看到一个标题,就回想一下对应的解题思路,这样很快就可以系统性的复习一遍二叉树了。

文章的顺序,实际就是循序渐进的,所以如下分类基本就是按照文章发文顺序来的,我再做一个系统性的分类。

二叉树理论基础

二叉树理论基础

关于二叉树,我们在二叉树理论基础一文中了解到:二叉树的种类、存储方式、遍历方式、定义方式

二叉树的遍历方式

深度优先遍历

  • 二叉树:二叉树的前中后序遍历(递归法)( 含leetcode上三道【前中后序】遍历题目):递归三部曲初次亮相

  • 递归:什么是递归中我们深入介绍了递归,总结了不少递归思想,模拟了递归过程。

  • 递归:中序遍历二叉树全过程图解中我们以二叉树的中序遍历为例,再次模拟跟进了递归流程。

  • 递归:再上两道简单递归题,熟练树的递归流程。通过两道题深入理解二叉树递归

  • 二叉树:熟悉递归法后,我们又介绍了二叉树的迭代法遍历:通过栈模拟递归。二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)

广度优先遍历

  • 二叉树除了深度优先外,还有一种常见遍历方式:广度优先遍历:通过队列模拟。二叉树的层序遍历(含八道leetcode相关题目)

N叉树的遍历方式

二叉树遍历熟练了,那么N叉树遍历基本也就通了,剧透一下:后面要讲的回溯专题和N叉树的遍历有异曲同工之妙。N叉树的前序与后续遍历(含两道leetcode题)

求二叉树的属性

二叉树:是否对称

101. 对称二叉树(共含三道leetcode题)

递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
迭代:使用队列/栈将两个节点顺序放入容器中进行比较

二叉树:求最大深度

104. 二叉树的最大深度(包括N叉树的最大深度)

递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
迭代:层序遍历

二叉树:求最小深度

111. 二叉树的最小深度

递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
迭代:层序遍历

二叉树:求有多少个节点

222. 完全二叉树的节点个数

递归:后序,通过递归函数的返回值计算节点数量
迭代:层序遍历

二叉树:是否平衡

110. 平衡二叉树

递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
迭代:效率很低,不推荐

二叉树:找所有路径

初识回溯:257. 二叉树的所有路径(回溯详解)
递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
迭代:一个栈模拟递归,一个栈来存放对应的遍历路径

二叉树:递归中如何隐藏着回溯

257. 二叉树的所有路径(回溯详解)

详解二叉树:找所有路径中递归如何隐藏着回溯

二叉树:求左叶子之和

404. 左叶子之和

递归:后序,必须三层约束条件,才能判断是否是左叶子。
迭代:直接模拟后序遍历

二叉树:求左下角的值

513. 找树左下角的值

递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。
迭代:层序遍历找最后一行最左边

二叉树:求路径总和3

112. 路径总和
递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。
迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和

二叉树的修改与构造

翻转二叉树

226. 翻转二叉树之多种解法(递归法、深度优先(迭代法)、广度优先【层序遍历】)
递归:前序,交换左右孩子
迭代:直接模拟前序遍历

构造二叉树

106. 从中序与后序遍历序列构造二叉树

递归:前序,重点在于找分割点,分左右区间构造
迭代:比较复杂,意义不大

构造最大的二叉树

654. 最大二叉树

递归:前序,分割点为数组最大值,分左右区间构造
迭代:比较复杂,意义不大

合并两个二叉树

617. 合并二叉树

递归:前序,同时操作两个树的节点,注意合并的规则
迭代:使用队列,类似层序遍历

求二叉搜索树的属性

二叉搜索树中的搜索

700. 二叉搜索树中的搜索

递归:二叉搜索树的递归是有方向的
迭代:因为有方向,所以迭代法很简单

是不是二叉搜索树

98. 验证二叉搜索树

递归:中序,相当于变成了判断一个序列是不是递增的
迭代:模拟中序,逻辑相同

求二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差

递归:中序,双指针操作(记录前一个遍历节点的技巧
迭代:模拟中序,逻辑相同

求二叉搜索树的众数

501. 二叉搜索树中的众数

递归:中序,清空结果集的技巧,遍历一遍便可求众数集合

二叉搜索树转成累加树

538. 把二叉搜索树转换为累加树

递归:中序,双指针操作累加

迭代:模拟中序,逻辑相同

二叉树公共祖先问题

二叉树的公共祖先问题

236. 二叉树的最近公共祖先

递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
迭代:不适合模拟回溯

二叉搜索树的公共祖先问题

235. 二叉搜索树的最近公共祖先

递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
迭代:按序遍历

二叉搜索树的修改与构造

二叉搜索树中的插入操作

701. 二叉搜索树中的插入操作

递归:顺序无所谓,通过递归函数返回值添加节点
迭代:按序遍历,需要记录插入父节点,这样才能做插入操作

二叉搜索树中的删除操作

450. 删除二叉搜索树中的节点

递归:前序,想清楚删除非叶子节点的情况
迭代:有序遍历,较复杂

修剪二叉搜索树

669. 修剪二叉搜索树

递归:前序,通过递归函数返回值删除节点
迭代:有序遍历,较复杂

构造二叉搜索树

108. 将有序数组转换为二叉搜索树

递归:前序,数组中间节点分割
迭代:较复杂,通过三个队列来模拟

最后总结

在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,得出大体分类。

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

  • 二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,而单纯求深度就可以用前序,二叉树:找所有路径也用了前序,这是为了方便让父节点指向子节点。

所以求普通二叉树的属性还是要具体问题具体分析。
在这里插入图片描述

最后,二叉树系列就这么完美结束了,接下来我们又要开始新的系列了「回溯算法」!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1552300.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

全国职业院校技能大赛(大数据赛项)-平台搭建Zookeeper笔记

ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,为分布式应用提供一致性服务。它的设计目标是简化分布式系统的管理,保证多个节点之间的数据一致性和协调工作。ZooKeeper提供了类似文件系统的层次化命名空间,用来存储和管理元数…

基于SpringBoot+Vue的留守儿童爱心网站系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

文件名称重命名批量操作:大量文件里的符号一键删除重命名

文件名重命名是一个常见需求,特别是在处理大量文件时,为了提高文件管理效率,文件批量改名高手实现批量重命名。把每个文件名里的符号删除。一起去试试。 1运行软件:在电脑里登录上文件批量改名高手,在三大功能中选择“…

Go语言入门:掌握基础语法与核心概念

Go(又称 Golang)是一种开源的编程语言,由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 在 2007 年设计。Go 语言在设计时考虑了现代多核处理器的并发计算,其语法简洁、易于理解,同时提供了高效的编译和执行…

带徒实训项目实战讲义分享:ApiFirst文档对比功能页面开发

亲爱的学员朋友,前面咱一起实现了入参列表对比的部分功能,本节在此基础上继续开发和重构代码,go! 文章目录 已实现的功能实现API入参列表的增删对比合并参数列表杜绝内部变量暴露提取modifiedType枚举 已实现的功能 基于0.0.6和…

Dubbo(学习笔记)

单体的应用架构: war可以对外的独立启动 jar是默认的 写操作是非幂等性的,多次写操作,会导致数据库出现错误的数据的情况。 影响RPC框架的性能主要有两点:序列化,建立连接(通讯) 灰度发布&#…

山高水长:要离职该怎么做——之找到一份工作

一、前言 有关离职的最好方法本应是显而易见的,但是许多软件开发者把离职这件事情都搞砸了( 1、以错误的方式离职会给你的职业生涯带来灾难性的后果,并且可能会给你的声望带来永久性的损害,特别是当你住在一座小镇上的时候。 2、…

2024-09-04 深入JavaScript高级语法十五——浏览器原理-V8引擎-js执行原理

目录 1、浏览器的工作原理1.1、认识浏览器内核1.2、浏览器渲染过程 2、JS引擎2.1、认识 JavaScript 引擎2.2、浏览器内核和JS引擎的关系2.3、V8引擎的原理2.4、V8引擎的架构2.5、V8执行的细节 3、全局代码的执行过程3.1、初始化全局对象3.2、执行上下文栈(调用栈&am…

RSA算法模拟实验报告(后篇,非常感谢橘味小奶糖的反馈)

有朋友说代码运行不出来,因为我是平板上写的,没在电脑上运行过,这也算是我的疏忽吧,今天尝试了一下,刚开始运行出来是乱码,改了一些东西,还是运行出来了。 我用的devc。 首先是文字显示&#…

基于SpringBoot+Vue的留学信息推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

应用中的错误处理概述

title: 应用中的错误处理概述 date: 2024/10/1 updated: 2024/10/1 author: cmdragon excerpt: 摘要:本文介绍了Nuxt中的错误处理机制,包括全局错误处理器和组件层级错误捕获,以及错误传递规则和生产环境下的处理方式 categories: 前端开发tags: 错误处理Nuxt应用全局处…

【含文档】基于Springboot+Vue的古风生活体验交流网站(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于JAVA+SpringBoot+Vue的校园商铺管理系统

基于JAVASpringBootVue的校园商铺管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…

解析!文档扫描 SDK 中的高级图像处理技术

随着世界数字化,文档扫描已成为现代商业运营的关键,它使文档的存储、访问和管理更加便捷。然而,扫描图像的质量对于这些数字档案的有效性至关重要。高质量的扫描可确保文本清晰、数据准确捕获并且信息易于检索。 另一方面,质量差…

视频——教学篇——12——定一个涨粉小目标,如何从0-10万粉?

文章目录 1、粉丝即正义。什么是粉丝价值?粉丝价值粉丝活跃度商业价值 2、找到账号目标和定位3、涨粉的基础是更新频率4、优质少更与良品多更的策略5、有播放却不涨粉?如何提高播放转粉率? 1、粉丝即正义。什么是粉丝价值? 在了解…

关于计算机算法设计方法的思考

灵感来源——二分图匹配对的男女配对 那种实际情况的背景解决不是无意义的“理解配对” 相反的是我认为这反而是设计的根本。人思考问题,再考虑如何使用计算机来实现。人能思考的逻辑问题计算机一般都可以实现,重要的是如何把问题掰碎扔给计算机解决。…

C0008.Clion利用C++开发Qt界面,使用OpenCV时,配置OpenCV方法

安装OpenCV 配置环境 配置Clion中的CMakeLists.txt文件 # 设置OpenCV的安装路径 set(OpenCV_DIR "D:/OpenCv_Win/opencv/build/x64/vc16/lib"

ubuntu 24.04如何分配内存

24版与之前有一点不同,这里记录一下我的经历,希望有帮助 1.进入ubuntu直接试用,没有之前的安装向导(如图),在屏幕的左上角会找到安装Ubuntu 2.分配内存 24的手动分配内存,不需要分配系统内存&…

Cannon-es.js之removeConstraint破坏约束案例

本文目录 前言最终效果1、postStep2、前置准备2.1 代码2.2 效果 3、removeConstraint3.1 解除约束代码效果 4、完整代码 前言 在3D物理引擎的广阔天地中,cannon-es以其轻量级、高性能和易于集成的特点,成为了WebGL环境中物理模拟的首选工具。它不仅能够精…

【C++】指针是啥东西?看这篇博客就够了!

指针到底是啥东西?很多人都有这样的问题,今天我就为大家来解答 首先看一行代码: int a; 很显然,这行代码的用途是定义变量,那么再看一行代码 int *a; 这下懵了吧,你们以为这是一行错误的代码&#xff…