前序和后序
前序只能获得根节点传过来的信息,
一旦你发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了。
543. 二叉树的直径 - 力扣(Leetcode)
(所有子树的) 左右子树最大深度之和
116. 填充每个节点的下一个右侧节点指针 - 力扣(Leetcode)
654. 最大二叉树 - 力扣(Leetcode)
递归构建
105. 从前序与中序遍历序列构造二叉树 - 力扣(Leetcode)
递归构建,找出root,然后构建左右子树
889. 根据前序和后序遍历构造二叉树 - 力扣(Leetcode)
构造出的树不唯一,关键在于 确定root在后序数组中的位置
1、首先把前序遍历结果的第一个元素或者后序遍历结果的最后一个元素确定为根节点的值。
2、然后把前序遍历结果的第二个元素作为左子树的根节点的值。
3、在后序遍历结果中寻找左子树根节点的值,从而确定了左子树的索引边界,进而确定右子树的索引边界,递归构造左右子树即可。
297. 二叉树的序列化与反序列化 - 力扣(Leetcode)
只用前序,记录下空节点,就可以根据此来还原整棵树
652. 寻找重复的子树 - 力扣(Leetcode)
后序遍历,用_分割节点值来获得每个子树的唯一序列,加入map,查重
归并排序
可以抽象成二叉树的后续遍历,归并函数 merge
二叉搜索树
230. 二叉搜索树中第K小的元素 - 力扣(Leetcode)
中序遍历为升序,事件复杂度O(N)
优化方法,在节点中记录此子树的size,从此可以推断出此节点的排序位置
538. 把二叉搜索树转换为累加树 - 力扣(Leetcode)
颠倒遍历顺序,降序, 维护一个sum 每遍历一个值,就将sum赋值给此节点
在 BST 中插入一个数、
在 BST 中删除一个数,找此节点左子树最大的或者右子树最小的与自己交换,然后删除
96. 不同的二叉搜索树 - 力扣(Leetcode)
动态规划
95. 不同的二叉搜索树 II - 力扣(Leetcode)
分治,递归地构建
215. 数组中的第K个最大元素 - 力扣(Leetcode)
快速排序、堆排序
剑指 Offer 68 - II. 二叉树的最近公共祖先 - 力扣(Leetcode)
1 记录所有节点的父节点
222. 完全二叉树的节点个数 - 力扣(Leetcode)
完全二叉树 左右子树最多只有一个不是满二叉树
先统计左右子树深度,在做分支