遍历
前/中/后
递归法:正常,没啥
迭代法:while+stack迭代,稍稍注意中序时候要用指针辅助,前/后方法相同
层级
用queue, while里用for限制添加节点
199. Binary Tree Right Side View
存每一层,把每一层末尾元素填进结果
257. 二叉树所有路径
先到leaf,在后序位置添加上一层,返回vec数组
二叉树的最近公共祖先
后序位置操作,返回找到了的二选一
*和二叉搜索树对比
构造
106. 从中序和后序序列构造
法1:记住left可以等于right,不要右开区间
105. 从前序和中序构造
法2优化:用map把中序的值index存起来,
最大二叉树
判断二叉树特点
101. 对称二叉树
双指针递归
110. 平衡二叉树
定义:左子树高度和右子树高度相差1
同样可以用递归,自下而上一旦不行就返回-1
543. 二叉树直径
直径不一定经过root,所以每个节点都要遍历,就是比较左最大深度加右最大深度
二叉树操作
226. 翻转二叉树
在后序位置进行翻转,
104.最大深度
递归思路,比较左右最大深度
111.最小深度
不同点在于对于空子树不计算深度(不能说0比其他小),还是要走到叶子然后比较深度。所以要检验nullptr,但是是小点,大体思路一样
404. 左叶子之和
左叶子的上一个root才能判断是否为叶子(需要用到root->left->left, root->left->right)
513. 找树左下角的值
最后一层的leftmost节点,没说是左/右子节点。
那么其实就是第一次更新深度时的那个节点值
Path Sum 路径总和
1)从root开始,看是否有路径和为target的,返回bool
用回溯,定义一个global
2)从root开始,看是否有路径和为target, 返回所有路径
标准回溯
437 3) 不从root开始,看有多少条路径和为target(不一定到最底层)
前缀和的一道题
回溯遍历,前序位置进行加法操作,
619. 合并二叉树
前序位置操作,空缺直接补
扁平化二叉树(将二叉树转成链表)
在后序位置操作,递归得到结果
*二叉搜索树
98. 有效二叉搜索树
利用辅助节点minNode和maxNode,二叉搜索树性质——左子树节点(all) < 根 < 右子树节点(all)
二叉搜索树利用中序遍历
二叉搜索树中的搜索
比较root节点值
530. 二叉搜索树的最小绝对差
利用二叉搜索树单调递增,最小绝对差就是遍历边
二叉树+双指针
502. 二叉搜索树中的众数
还是利用二叉搜索树的递增性质
236. 二叉搜索树的最近公共祖先
直接利用性质:往下找到第一个在两个值中间的节点就是最近公共祖先。
*和二叉树对比
701. 二叉搜索树插入
使用递归,在最底层创建节点,由上一次调用的root->left 或 root->right接住
450. 二叉搜索树删除(挺复杂)
先分3种情况删,在前序位置操作,然后用插入的方法,上一次调用接住
669.修剪二叉搜索树
让二叉搜索树在【low, high】的范围内
这题也好,锻炼设计递归。要点在于返回合法节点
108. 二叉搜索树构造:有序数组转成高度相等的二叉搜索树
尽量二分,左闭右闭
把二叉搜索树转换为累加树
需要利用上一个遍历位置的元素时考虑用双指针
第k个最小元素
直接遍历,取第k个,利用二叉搜索树的递增属性
*完全二叉树
222.完全二叉树节点个树
定义:除最后一行其余全满
用递归,自下而上得到答案