题目介绍
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例1
输入: 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 个下标的位置上
解题步骤如下:
- 如果这棵树是一棵空树,直接返回
[] - 定义用于存放整棵树层序遍历结果的数组
ans,定义变量k表示节点所在的层数 - 如果在
ans中下标为k的位置没有值,说明这一层还没有遍历节点,因此在ans[k]放置一个空数组[] - 将当前节点的值插入到
ans[k]这个数组中 - 判断当前节点是否有左节点,如果有,递归遍历左节点,并将
k + 1传递到递归函数中 - 判断当前节点是否有右节点,如果有,递归遍历右节点,并将
k + 1传递到递归函数中 - 重复
3-6的过程,直到层序遍历完整棵树 - 返回
ans翻转之后的结果
解题代码
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)
}