1. 自底向上+动态规划
## 二叉树
对于递归问题中的参数,一定要分清是需要传的值还是引用,如果某个变量需要在递归过程中改变则需要传引用,否则一般建议传值,比如230题如果用k表示遍历过节点的个数则传引用
### 双递归
优先选择x节点的相邻节点作为y节点的落子点,比如选择左孩子节点作为y的落子点,那么左孩子方向的节点红方都不能用。
分别统计x节点的左右孩子节点,父节点三个方向的节点个数,如果其中的一个方向的节点数比另外两个方向的节点树还多,那么y方就赢了。
### 重建二叉树
先确定根节点,然后分别确定左右子树的节点。
###自底向上(后序遍历)
能够根据子树推倒出, 这个特点其实也是动态规划的特点,只不过因为存在重叠子问题,而动态规划无非是利用空间换时间来解决重叠子问题。
自底向上,对每个根节点而言该节点可能被打击,也可能不被打击。被打劫时,其左右孩子节点不能被打击,不被打劫时,其孩子节点可能被打劫也可能不被打劫。
后序遍历记录每个节点到所有叶子节点的距离,左右子树交叉比较所有节点是否满足条件。
记忆+后序遍历
邻接表+dfs+seen标记
###自顶往下
参数(sum & parent)扩展 + 前序遍历
偶数编号节点可能是根节点,先构建左右子树,再构建已当前节点为根的所有树。
dfs返回节点可以建立父亲节点和孩子节点的关系,当出现需要删除的节点时则左右子树可能会成为新树,但是这个新树的根也可能是目标节点,因此需要再处理完成后移除空节点。
就是查找路径最大值
前序+hash计数
###序列化与反序列化
序列化(注意区分1,11,111这种节点,节点和节点之间要有分隔符)+hash
### 路径问题
双递归:多源搜索问题(所有xxxx)
### 二叉搜索树
巧用非递归中序遍历
右中左遍历+参数扩展
865. 具有所有最深节点的最小子树 1123. 最深叶节点的最近公共祖先
层次遍历+最低公共祖先
### 层次遍历/BFS
父节点+访问记录表+层次遍历
### 完全二叉树
从1开始编号,从上到下从左到右给完全二叉树编号,其二进制表示的特点是最高位为1表示从根节点出发,0表示沿着左节点往下,1表示沿着右节点往下。
完全二叉树只有最后一层节点不满,其节点编号为 [2^h,2^h-1] h为树的高度(h从0开始)。
利用父节点和子节点编号之间的关系 假设父节点编号为i 则左孩子编号为2i 有孩子节点编号为2i+1, 如果是奇数行则编号与label一致,否则编号与其label则成对称关系,和为level_min+level_max