层序遍历的稍微升级
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
给个🌰 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
,输出
var output = [
[1],
[3, 2],
[4, 5, 6, 7],
[10 ,9, 8]
]
上一篇 二叉树的层序遍历,照着动画演示
迭代
- 用一个遍历index记录下是第几层,
单数层从左到右
双数层从右往左
- 来做下调整即可
function levelorder(root) {
// 空节点的情况不能忘记了😭
if(root === null) return []
// 输出结果
const res = []
// 先入栈第一层
let stack = [root]
// index 代表二叉树是第index层
let index = 1
// 循环终止条件:栈中没有节点
while(stack.length) {
// 循环依次输出我们的节点
// 这里我们输出按照LeetCode的结果, 每一层一个数组
const level = []
// 需要下一层的栈保存我们下一层的节点
const nextLevelNodes = []
for (let i = 0; i < stack.length; i++) {
if (index % 2 === 1) {
level.push(stack[i].val)
} else {
level.push(stack[i].length - 1 - i)
}
if(stack[i].left) nextLevelNodes.push(stack[i].left)
if(stack[i].right) nextLevelNodes.push(stack[i].right)
}
// 输出到我们的结果中
res.push(level)
// 当前层输出结束,我们把下一层变成当前层
stack = nextLevelNodes
// 层数加1
index++
}
return res
}
递归
同理
var levelOrder = function(root) {
// 空节点
if (root === null) return []
// 定义输出结果
let res = []
// 递归遍历,传根节点,层数:开始是第1层,输出结果存起来
dfs(root, 1, res)
return res
};
function dfs(root, index, res) {
// 第一次深度遍历时候,先加上一个空数组
if (res.length < index) {
res.push([])
}
// 然后把第index层 结果的第index - 1项push 或 unshift
if (index % 2 === 1) {
res[index - 1].push(root.val)
} else {
res[index - 1].unshift(root.val)
}
// 对子节点递归遍历 层数加1
if (root.left) dfs(root.left, index + 1, res)
if (root.right) dfs(root.right, index + 1, res)
}
总结
波风水门