「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
题目
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
树中节点数目在范围 [0, 2000] 内
-100 <= Node.val <= 100
来源:力扣(LeetCode)leetcode-cn.com/problems/bi…
解题思路
递归方式:从根节点开始,将每个节点的值放在二维数组的第 k 个数组中,如果二维数组没有第 k 个数组,则插入一个空数组。k 也代表节点所在层数。再递归把左右子节点放入第 k + 1 个数组中。
将二维数组中下标为偶数的数组进行翻转。
代码实现
var zigzagLevelOrder = function(root) {
const ans = []
//层序遍历二叉树
getResult(root, 0, ans)
//将二维数组中下标为偶数的数组进行翻转
for (let i = 1; i < ans.length; i += 2) {
reverse(ans[i])
}
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)
}
如有错误欢迎指出,欢迎一起讨论!