力扣刷题👊【103. 二叉树的锯齿形层序遍历】广度搜索

143 阅读1分钟

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

题目链接

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

测试用例

示例 1:

image.png

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]

条件限制

  • 树中节点数目在范围 [0, 2000] 内
  • 100 <= Node.val <= 100

题目分析

image.png

阅读题目,需要我们使用如上示意图的方式来遍历二叉树,总体的顺序是从上往下一层层的遍历,但是在遍历每一层的时候,需要遵循先左后右,遍历下一层的时候需要变换遍历的左右的先后顺序,这就是题目所要求的锯齿形遍历

在解这题的时候,我们可以参考这篇文章 力扣刷题👊【107. 二叉树的层序遍历 II】广度搜索 - 掘金 (juejin.cn),差不多的解题思路,两个数组来记录当前层需要遍历的节点,以及下一层计划遍历的节点。这里最大的差别就是需要再引入一个标记 flag,用此标记出当前层记录节点值的顺序是正序还是倒序(即我们根据 flag 来使用 Array.push 将节点值插入到末尾,或者是使用 Array.unshift 将节点值插入到开头

代码实现

和 107 题的区别基本围绕在 flag 的相关操作上

var zigzagLevelOrder = function(root) {
    if (root == null) return [];
    let arr1 = [root],
        arr2 = [],
        flag = true,
        arrs = [];
    while (arr1.length > 0 || arr2.length > 0) {
        arrs.push([]);
        while (arr1.length > 0) {
            let curr = arr1.pop();
            if (flag) {
                arrs[arrs.length - 1].push(curr.val);
            } else {
                arrs[arrs.length - 1].unshift(curr.val);
            }
            if (curr.left != null) arr2.push(curr.left)
            if (curr.right != null) arr2.push(curr.right)
        }
        flag = !flag;
        arr1 = arr2;
        arr2 = [];
    }
    return arrs;
};

image.png

历经艰难,终于写出了时间复杂度超越 99% 的算法,空间复杂度还是那么拉垮,或者使用深度搜索可以优化空间复杂度?