[路飞]_从上到下打印二叉树II

115 阅读1分钟

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

题目介绍

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

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

 3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

提示:

  1. 节点总数 <= 1000

解题思路

本题比较简单,使用递归,每次递归的时候我们传入当前的节点、当前节点所在的层数、以及存放最后结果的数组

解题步骤:

  1. 判断是不是一棵空树,如果是空树,则直接返回 []
  2. 定义当前的层数 k,从 0 开始,即根节点是第 0 层,定义存放最后结果的数组 ans
  3. 如果数组下标为 k 的位置是 undefined,那么将一个空数组放到这个位置,否则往 ans[k] 的数组中插入当前的值
  4. 如果有左节点,则递归遍历左节点,如果有有右节点,则递归遍历右节点
  5. 重复 3-4 的步骤,直到遍历完整棵树,将 ans 数组返回

解题代码

var levelOrder = function(root) {
    // 如果是空树,则返回 []
    if (!root) return []
    let k = 0
    const ans = []
    // 根节点所在的层数为 0
    return _levelOrder(root, k, ans)
};

var _levelOrder = function(root, k, ans) {
    // 如果数组的第 k 个位置没有值,则放置一个 []
    if (!ans[k]) ans[k] = []
    // 往数组第 k 个位置的数组插入当前节点的值
    ans[k].push(root.val)
    // 如果有左节点则递归遍历左子树
    root.left && _levelOrder(root.left, k + 1, ans)
    // 如果有右节点则递归遍历右子树
    root.right && _levelOrder(root.right, k + 1, ans)
    // 返回最后的结果数组
    return ans
}