[路飞]_LeetCode_103. 二叉树的锯齿形层序遍历

135 阅读2分钟

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

题目

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

image.png

输入: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 个数组中。

将二维数组中下标为偶数的数组进行翻转。

image.png

代码实现


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)
}

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