104.
recursion:
前序是先评估本轮recursion的节点深度,然后再往下一个节点,一个一个看哪个最深(用max_depth记录好)。
后序是收集左右两个子节点各自的高度,然后挑大的再加一就是本节点的高度,从下到上就能求出root node的高度,which is 最深深度。
iteration(queue):
level traverse
559.
和104的前序一样,分三步,
1. 存储最大值
2. 判断是否是leaf node,如果是的话直接返回
a. binary tree就if(!root -> left && !root -> right)
b. n-tree就if(root -> children.size() == 0)
3. 递归子节点
a. 一定要判断left和right是否存在
b. n-tree能进for loop一定存在所以不用单独判断
同样需要注意的是,在主function里先写出头节点不存在的情况(直接return 0)
111. 最小深度
后序遍历:
返回子叶的最短深度 + 1就是root node的最短深度
和最大深度不同,需要判断左右是否有子节点,如果没有节点的地方直接返回depth 为0的话,其实并没有遍历到Leaf node,也就是说并不是深度,如随想录中可见:
这种情况就要分情况讨论, 如果left right都没有到leaf node了,那就可以正常返回1,如果有左无右或者有右无左,那就不要考虑没有的那一边,只对有节点的地方recursion就行,如果左右都有那就像求max_depth一样返回 1 + min((recursion(left),recursion(right))就行
前序遍历:
最开始root == NULL的情况要放在main里,防止放在preorder()里的时候和recursion到底遇到NULL混淆。recursion里遇到null要直接返回,不需要设置min为0
222. 完全(complete)与满(full)的区别
首先最直接的方式是直接遍历,数节点个数
其次可以利用完全二叉树的性质:完全二叉树resursion到下面一定是满二叉树,而满二叉树的节点个数是:num_level ^ 2 - 1
注意 2 << 1是 2 * 2的意思,而不是2 * 1