给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树[3,9,20,null,null,15,7]
3
/ \\
9 20
/ \\
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
这道题与二叉树的层序遍历只有一点不同,就是锯齿形,左右,右左的遍历,那我们只需要增加一下增肌的判断即可,当单数层数时左右遍历,当双数层数时右左遍历,反向遍历只需要将最新的值添加到队列最前面即可。
深度优先
var zigzagLevelOrder = function (root) {
let res = [];
let k = 0;
getDetail(root, k, res)
return res
function getDetail(root, k, res) {
if (!root) return [];
if (k == res.length) res.push([])
if (k % 2 == 0) {
res[k].push(root.val);
} else {
res[k].unshift(root.val);
}
getDetail(root.left, k + 1, res)
getDetail(root.right, k + 1, res)
}
};
广度优先
var zigzagLevelOrder = function (root) {
let res = [];
if (!root) return res;
let k = 0;
let queue = [];
queue.push(root)
while (queue.length) {
let temp = [];
let len = queue.length
for (let i = 0; i < len; i++) {
let node = queue.shift();
k % 2 == 0 ? temp.push(node.val) : temp.unshift(node.val)
node.left && queue.push(node.left)
node.right && queue.push(node.right)
}
k++
res.push(temp)
}
return res
};