「这是我参与2022首次更文挑战的第 11 天,活动详情查看:2022首次更文挑战」
题目链接
103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
测试用例
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]
条件限制
- 树中节点数目在范围 [0, 2000] 内
- 100 <= Node.val <= 100
题目分析
阅读题目,需要我们使用如上示意图的方式来遍历二叉树,总体的顺序是从上往下一层层的遍历,但是在遍历每一层的时候,需要遵循先左后右,遍历下一层的时候需要变换遍历的左右的先后顺序,这就是题目所要求的锯齿形遍历
在解这题的时候,我们可以参考这篇文章 力扣刷题👊【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;
};
历经艰难,终于写出了时间复杂度超越 99% 的算法,空间复杂度还是那么拉垮,或者使用深度搜索可以优化空间复杂度?