题目
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
解题思路
这也能算一题,习惯就好
参见另一片:从上到下打印二叉树 II
递归法
通过level变量记录二叉树递归层级;将枚举到的二叉树节点值塞进指定层级中。
层级为基数从左向右塞数据,
层数为偶数,从右向左塞数据。
代码
将本层全部节点打印到一行,并将下一层全部节点加入队列;
层级为基数从左向右塞数据,
层数为偶数,从右向左塞数据。
var zigzagLevelOrder = function(root) {
let result = []
helper(root,0)
return result
function helper(node,level){
if(node === null) return 0;
if(result[level] === undefined){
result[level] = []
}
const n = node.val
if(level %2 === 0){
result[level].push(n)
}else{
result[level].unshift(n)
}
helper(node.left,level+1)
helper(node.right,level+1)
}
};
迭代法
var zigzagLevelOrder = function(root) {
if (root === null) return []
const result = [];
let sign = 0;
let stack = [root]
while (stack.length) {
const path = []
for (let i = stack.length - 1; i >= 0; i--) {
let temp = stack.shift()
if(sign%2 === 0){
path.push(temp.val)
}else{
path.unshift(temp.val)
}
temp.left && stack.push(temp.left)
temp.right && stack.push(temp.right)
}
result.push(path);
sign++
}
return result
};