[路飞]_二叉树的层序遍历II

119 阅读2分钟

leetcode-107 二叉树的层序遍历II
b站视频

题目介绍

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例1

image.png

输入: root = [3,9,20,null,null,15,7]
输出: [[15,7],[9,20],[3]]

示例2

输入: root = [1]
输出: [[1]]

示例3

输入: root = []
输出: []

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

解题思路

本题要求我们做到 自底向上层序遍历,如果一开始就从底部开始遍历的话会比较困难,毕竟我们遍历树结构的时候都是从根节点开始,因此,我们可以从根节点开始层序遍历整棵树,遍历完整棵树之后,将整个数组反转一下,就能够得到 自底向上层序遍历的结果了

那么如何进行一棵树的层序遍历,并且将每一层的节点放到结果数组同一个下标的数组中去。我们可以在递归遍历树的时候,为每一层的节点传递一个代表当前层数的值 k,然后在遍历到子节点的时候,将这个 k + 1 传递到下一层递归函数里去,这样就可以将第 k 层的节点都放置在结果数组的第 k 个下标的位置上

解题步骤如下:

  1. 如果这棵树是一棵空树,直接返回 []
  2. 定义用于存放整棵树层序遍历结果的数组 ans,定义变量 k 表示节点所在的层数
  3. 如果在 ans 中下标为 k 的位置没有值,说明这一层还没有遍历节点,因此在 ans[k] 放置一个空数组 []
  4. 将当前节点的值插入到 ans[k] 这个数组中
  5. 判断当前节点是否有左节点,如果有,递归遍历左节点,并将 k + 1 传递到递归函数中
  6. 判断当前节点是否有右节点,如果有,递归遍历右节点,并将 k + 1 传递到递归函数中
  7. 重复 3-6 的过程,直到层序遍历完整棵树
  8. 返回 ans 翻转之后的结果

1.gif

解题代码

var levelOrderBottom = function(root) {
    if (!root) return []
    const ans = []
    let k = 0
    _levelOrder(root, k, ans)
    return ans.reverse()
};

var _levelOrder = function(root, k, ans) {
    if (!ans[k]) ans[k] = []
    ans[k].push(root.val)
    root.left && _levelOrder(root.left, k + 1, ans)
    root.right && _levelOrder(root.right, k + 1, ans)
}