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

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

题目

给你二叉树的根节点 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
复制代码

来源:力扣(LeetCode)leetcode-cn.com/problems/bi…

解题思路

递归方式:从根节点开始,将每个节点的值放在二维数组的第 k 个数组中,如果二维数组没有第 k 个数组,则插入一个空数组。k 也代表节点所在层数。再递归把左右子节点放入第 k + 1 个数组中。

然后通过双指针将递归得到的二维数组进行翻转,得到最终的结果。获取过程如下图所示:

image.png

扫描二维码关注公众号,回复: 13678028 查看本文章

代码实现


var levelOrderBottom = function(root) {
    const ans = []

    //层序遍历二叉树
    getResult(root, 0, ans)
    reverse(ans)

    return ans
};

var reverse = function(arr) {
    //通过双指针翻转数组
    for (let i = 0, j = arr.length - 1; i < j; i++, j--) {
        //交换第 i 和 第 j 个数组
        [arr[i], arr[j]] = [arr[j], arr[i]]
    }
}

/**
 * 递归函数的意义:把 root 的值放到 ans 的第 k 个数组当中,k 从 0 开始
 */
var getResult = function(root, k, ans) {
    //如果 root 为空时不需要处理
    if (!root) return

    //如果 ans[k] 不存在,则先向 ans 中增加一个空数组
    if (k === ans.length) ans.push([])
    
    //将 root 的值插入第 k 个数组的末尾
    ans[k].push(root.val)
    
    //把 root 的左节点的值放到第 k + 1 个数组中
    getResult(root.left, k + 1, ans)
    
    //把 root 的右节点的值放到第 k + 1 个数组中
    getResult(root.right, k + 1, ans)
}
复制代码

如有错误欢迎指出,欢迎一起讨论!

猜你喜欢

转载自juejin.im/post/7061998266535116836