[路飞]_一起刷leetcode 剑指 Offer 32 - II. 从上到下打印二叉树 II

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

剑指 Offer 32 - II. 从上到下打印二叉树 II

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
复制代码

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]
复制代码

提示:

  1. 节点总数 <= 1000

思路

  1. 这道题目考的是二叉树的BFS(Breath First Search)广度优先搜索
  2. 如果不用递归做的话,迭代法可以用一个队列来存储每一行的有效值,因为是从左往右打印,所以需要用队列而不是栈。队列的特性是先进先出,而栈是先入后出;
  3. 每一轮不止输出当前值,同时记录下一轮的值,当有子节点的时候把子节点放到下一轮使用。

实现

/**
 * 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;
};
复制代码

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。

猜你喜欢

转载自juejin.im/post/7041171979461722142