-
二叉树的理论基础
代码随想录算法day11 | 二叉树part01 | 递归遍历 , 迭代遍历,统一迭代,层序遍历-CSDN博客
- 二叉树的种类、存储方式、遍历方式、定义方式
-
二叉树的遍历方式
代码随想录算法day11 | 二叉树part01 | 递归遍历 , 迭代遍历,统一迭代,层序遍历-CSDN博客
- 深度优先遍历
- 递归法:递归三部曲初次亮相
- 迭代法:通过栈模拟递归
- 前中后序统一迭代法
- 广度优先遍历
- 层次遍历:通过队列模拟
-
求二叉树的属性
代码随想录算法day12 | 二叉树part02 | 226.翻转二叉树 ,101. 对称二叉树 ,104.二叉树的最大深度 ,111.二叉树的最小深度-CSDN博客
- 101.对称二叉树
- 递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
- 迭代:使用队列/栈将两个节点顺序放入容器中进行比较
- 104.二叉树的最大深度
- 递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
- 迭代:层序遍历
- 111.二叉树的最小深度
- 递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
- 迭代:层序遍历
代码随想录算法day13 | 二叉树part03 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222.完全二叉树的节点个数-CSDN博客
- 222.完全二叉树的节点个数
- 递归:后序,通过递归函数的返回值计算节点数量
- 迭代:层序遍历
- 110.平衡二叉树
- 递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
- 迭代:效率很低,不推荐
- 257.二叉树的所有路径
- 递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
- 迭代:一个栈模拟递归,一个栈来存放对应的遍历路径
- 404.左叶子之和
- 递归:后序,必须三层约束条件,才能判断是否是左叶子。
- 迭代:直接模拟后序遍历
代码随想录算法day14 | 二叉树part04 | 513.找树左下角的值,112.路径总和,113.路径总和Ⅱ,106.从中序与后序遍历序列构造二叉树-CSDN博客
- 513.找树左下角的值
- 递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。
- 层序遍历找最后一行最左边
- 112.路径总和
- 递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。
- 迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和
二叉树的修改与构造
代码随想录算法day12 | 二叉树part02 | 226.翻转二叉树 ,101. 对称二叉树 ,104.二叉树的最大深度 ,111.二叉树的最小深度-CSDN博客
- 226.翻转二叉树
- 递归:前序,交换左右孩子
- 迭代:直接模拟前序遍历
代码随想录算法day14 | 二叉树part04 | 513.找树左下角的值,112.路径总和,113.路径总和Ⅱ,106.从中序与后序遍历序列构造二叉树-CSDN博客
- 106.从中序和后序遍历序列构造二叉树
- 递归:前序,重点在于找分割点,分左右区间构造
- 迭代:比较复杂,意义不大
代码随想录算法day16 | 二叉树part06 | 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树-CSDN博客
- 654.最大二叉树
- 递归:前序,分割点为数组最大值,分左右区间构造
- 迭代:比较复杂,意义不大
- 617.合并二叉树
- 递归:前序,同时操作两个树的节点,注意合并的规则
- 迭代:使用队列,类似层序遍历
求二叉搜索树的属性
代码随想录算法day16 | 二叉树part06 | 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树-CSDN博客
-
700.二叉搜索树中的搜索
- 递归:二叉搜索树的递归是有方向的
- 迭代:因为有方向,所以迭代法很简单
-
98.验证二叉搜索树
- 递归:中序,相当于变成了判断一个序列是不是递增的
- 迭代:模拟中序,逻辑相同
代码随想录算法day15 | 二叉树part05 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236.二叉树的最近公共祖先-CSDN博客
-
530.二叉搜索树的最小绝对差
- 递归:中序,双指针操作
- 迭代:模拟中序,逻辑相同
-
501.二叉搜索树中的众数
-
递归:中序,清空结果集的技巧,遍历一遍便可求众数集合
-
代码随想录算法day18 | 二叉树part08 | 669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树-CSDN博客
- 538.把二叉搜索树转换为累加树
-
递归:中序,双指针操作累加
-
迭代:模拟中序,逻辑相同
-
二叉树公共祖先问题
代码随想录算法day15 | 二叉树part05 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236.二叉树的最近公共祖先-CSDN博客
- 236. 二叉树的最近公共祖先
- 递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
- 迭代:不适合模拟回溯
代码随想录算法day17 | 二叉树part07 | 235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点-CSDN博客
- 235. 二叉搜索树的最近公共祖先
- 递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
- 迭代:按序遍历
二叉搜索树的修改与构造
代码随想录算法day17 | 二叉树part07 | 235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点-CSDN博客
- 701.二叉搜索树中的插入操作
- 递归:顺序无所谓,通过递归函数返回值添加节点
- 迭代:按序遍历,需要记录插入父节点,这样才能做插入操作
- 450.删除二叉搜索树中的节点
- 递归:前序,想清楚删除非叶子节点的情况
- 迭代:有序遍历,较复杂
代码随想录算法day18 | 二叉树part08 | 669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树-CSDN博客
- 669.修建二叉搜索树
- 递归:前序,通过递归函数返回值删除节点
- 迭代:有序遍历,较复杂
- 108.将有序数组转换为二叉搜索树
- 递归:前序,数组中间节点分割
- 迭代:较复杂,通过三个队列来模拟
最后总结
- 在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,给大家大体分分类。
-
涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
-
求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
-
求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。
- 注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,257.二叉树的所有路径也用了前序,这是为了方便让父节点指向子节点。
- 所以求普通二叉树的属性还是要具体问题具体分析。