Leetcode二叉树的锯齿层次遍历

120 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

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

例1: image.png

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

二、解题思路

这道题我解题的时候没有遇到阻塞,提交时也没有调试一遍ac。简单而言就是进行广度优先搜索,维护两个队列,一个队列存放当前层的节点,另一个存放下一层的节点。遍历每层的节点时,首先将该节点从队列移出,往下一个队列中存放它的左右子节点,然后将该节点值放入遍历的数组,将遍历数组加入最终答案数组时,要判断一下当前遍历数组是要正向还是反向。

三、AC代码

var zigzagLevelOrder = function(root) {
    if(!root) return []
    let ans = [];
    let cur = [];
    let stack = [root];
    let nextStack = [];
    let reverseFlag = false;
    while(stack.length){
        node = stack.shift();
        cur.push(node.val);
        if(node.left) nextStack.push(node.left);
        if(node.right) nextStack.push(node.right);
        if(!stack.length){
            stack = nextStack;
            nextStack = [];
            if(reverseFlag){
                ans.push(cur.reverse());
            }else{
                ans.push(cur);
            }
            reverseFlag = !reverseFlag;
            cur = [];
        }
    }
    return ans
};

四、总结

整个题解还是思路还是相当清晰的,美中不足的是使用了较多的变量,看一下还有没有优化的空间。