「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
题目
给你二叉树的根节点 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
复制代码
来源:力扣(LeetCode)leetcode-cn.com/problems/bi…
解题思路
递归方式:从根节点开始,将每个节点的值放在二维数组的第 k 个数组中,如果二维数组没有第 k 个数组,则插入一个空数组。k 也代表节点所在层数。再递归把左右子节点放入第 k + 1 个数组中。
然后通过双指针将递归得到的二维数组进行翻转,得到最终的结果。获取过程如下图所示:
扫描二维码关注公众号,回复:
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)
}
复制代码
如有错误欢迎指出,欢迎一起讨论!