大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。
题目
剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
复制代码
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
复制代码
提示:
节点总数 <= 1000
思路
- 这道题目考的是二叉树的BFS(Breath First Search)广度优先搜索;
- 如果不用递归做的话,迭代法可以用一个队列来存储每一行的有效值,因为是从左往右打印,所以需要用队列而不是栈。队列的特性是先进先出,而栈是先入后出;
- 每一轮不止输出当前值,同时记录下一轮的值,当有子节点的时候把子节点放到下一轮使用。
实现
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrder = function(root) {
if (!root) return [];
// 记录下一级的有效节点
let queue = [ root ];
// 记录结果
let result = [];
// 还有下一级就继续循环
while (queue.length) {
// 存储当前层级的所有值
let temp = [];
// 把当前层的所有值放进结果中,把下一轮的有效节点记录起来
queue = queue.reduce((total, cur) => {
temp.push(cur.val);
cur.left && total.push(cur.left);
cur.right && total.push(cur.right);
return total;
}, []);
// 放进结果中
result.push(temp);
}
return result;
};
复制代码
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。