层序遍历 10
不同于前/中/后序遍历可以用stack实现,层序遍历使用queue实现的。之所以要用queue,是因为每次push之后的queue都是[left, right],因此shift可以从头(即left)取走。
学会二叉树的层序遍历,可以一口气打完以下十题:
102.二叉树的层序遍历 (最basic的)
107.二叉树的层次遍历II (将102的结果array reverse即可)
199.二叉树的右视图 (每个curLevel都只取最后一个值push到res中)
637.二叉树的层平均值 (每个curLevel都计算出平均值push到res中)
429.N叉树的层序遍历 (把之前的curNode.left, curNode.right替换成 for(let item of curNode.children){if(item) queue.push(item);})
515.在每个树行中找最大值 (找每个curLevel的最大值)
116.填充每个节点的下一个右侧节点指针 (不再需要res或者curLevel,相反,需要if (i < len - 1) {curNode.next = queue[0];} 去构造指针。
117.填充每个节点的下一个右侧节点指针II (同上题)
104.二叉树的最大深度 (res.length即可)
111.二叉树的最小深度 (需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点)
226.翻转二叉树
#1 自己看到题目的第一想法
层序遍历之后每次都把curlevel node.left和node.right调换一下就可以。
#2 看完代码随想录之后的想法
递归非常的简单,只需要确定中止条件,即if (root === null) return root;即可。
此外,本体也可以使用迭代(模拟深度优先遍历)来写
101.对称二叉树 2
#1 看完代码随想录之后的想法
递归三部曲一定要牢记:传入的参数,中止条件以及单层逻辑。
本体的传入参数为左数和右数;
中止条件比较tricky,中止条件如果左边的为null,右边的不为null或者相反,则要返回false,如果左右都为null,则返回true,如果val不相等,也返回false。
单层逻辑即如果左右都返回true,那么则为true,否则为false。
#2 类似题
100.相同的树
572.另一个树的子树