代码随想录算法训练营第十五天 | 层序遍历 10 226.翻转二叉树 101.对称二叉树 2

层序遍历 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.另一个树的子树

你可能感兴趣的:(代码随想录算法训练营第十五天 | 层序遍历 10 226.翻转二叉树 101.对称二叉树 2)