Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例1:
输入: 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
};
四、总结
整个题解还是思路还是相当清晰的,美中不足的是使用了较多的变量,看一下还有没有优化的空间。