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

93 阅读1分钟

题目

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

 

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

 

提示:

  1. 节点总数 <= 1000

注意:本题与主站 102 题相同:leetcode-cn.com/problems/bi…

代码

/**
 * 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 == null) return [];
    let queue = [root];
    let result = [];
    while(queue.length) {
       let tmp = [];
       let len = queue.length;
       for (let i = 0; i < len; i++) {
           let node = queue.shift();
           node && tmp.push(node.val);
           node.left && queue.push(node.left)
           node.right && queue.push(node.right)
       }
       result.push(tmp)
    }
    return result;
};

题解

这道题目 从上到下打印二叉树I一个变种,解法依旧使用广度优先遍历(BFS), 但在遍历每一层时,需要用tmp = []数组保存每一层的元素。

具体执行流程:

  1. 如果树的根节点为空,则直接返回[]

  2. 初始化,声明结果数组res = [], 包含根节点的队列queue = [root]

  3. 循环当队列为空时终止

    • 新建一个临时数组tmp = [], 用于保留当层节点值
    • 当前层循环,循环次数为当前层的节点数(即队列的长度)
      • 出队, 队首元素出队,即node = queue.shift()
      • 添加节点值, 将node.val添加到 res中, 即res.push(node.val)
      • 添加左右子节点,当node.leftnode.right都不为空,将左右子节点添加到tmp
    • 将当前结果tmp添加res
  4. 返回结果数组res即可

原题链接

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