文章目录
- 前言
- 二叉树理论基础
- 二叉树理论基础
- 二叉树的遍历方式
- 深度优先遍历
- 广度优先遍历
- 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. 将有序数组转换为二叉搜索树
递归:前序,数组中间节点分割
迭代:较复杂,通过三个队列来模拟
最后总结
在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,得出大体分类。
-
涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定
前序
,都是先构造中节点。 -
求普通二叉树的属性,一般是
后序
,一般要通过递归函数的返回值做计算。 -
求
二叉搜索树
的属性,一定是中序
了,要不白瞎了有序性了。
注意在普通二叉树的属性中,我用的是一般为后序
,而单纯求深度就可以用前序
,二叉树:找所有路径也用了前序
,这是为了方便让父节点指向子节点。
所以求普通二叉树的属性还是要具体问题具体分析。
最后,二叉树系列就这么完美结束了,接下来我们又要开始新的系列了「回溯算法」!