题目描述
思路分析
这题在上一道 层序遍历的基础上会更加方便。我们之前就可以得到每一层的数据,此时只是对每一层的遍历顺序做相应的处理即可
注意:
1. 我们在向tempQueue中添加元素时使用的是push ,比如我们一棵树的某一层从左到右的结果依次是
2 4 6 8,那么我们依次添加到tempQueue中的数据顺序也是 2 4 6 8 因为我们是对左子树和右子树分别判断,如果有结果 就将其push进去
2. 之后再处理结果时,是对数组中的每一项元素 shift
处理,也就是 会依次得到 2 4 6 8 这是当我们遍历偶数层时想要得到的结果
3. 之后再遍历奇数层时,我们想要存进curLevel
中的顺序为 8 6 4 2 ,此时从tempQueue中的数据仍然是shift出的,也就是我们依次得到的数据为 2 4 6 8,如何得到8 6 4 2?对于奇数深度,我们就要使用unshift,也就是从头部插入,就会得到我们想要的预期结果。
4. 其它部分的代码与之前的层序遍历类似,只是我们在每一层上加了一层判断,其余的不变。
代码参考
/*
给定一个二叉树,返回该二叉树的之字形层序遍历,
(第一层从左向右,下一层从右向左,一直这样交替)
*/
const Print = function (root) {
// 初始化result以及临时数组用于存储
const result = [],
tempQueue = []
// 表示当前深度
let depth = 0
if (!root) return result
tempQueue.push(root)
while (tempQueue.length) {
const len = tempQueue.length
const curLevel = []
const flag = depth % 2 === 0
for (let i = 0; i < len; i++) {
// 存数据时都是push进数组的,是有顺序的,先left再right,比如 2 4 6 8
// 我们对数组是shift,也就是会先弹出2 之后在 4 6 8
const node = tempQueue.shift()
// 如果是偶数层,那么需要得到的结果为 2 4 6 8
if (flag) {
curLevel.push(node.val)
node.left && tempQueue.push(node.left)
node.right && tempQueue.push(node.right)
}
// 如果是偶数层,则需要得到的结果顺序为 8 6 4 2,
else {
curLevel.unshift(node.val)
node.left && tempQueue.push(node.left)
node.right && tempQueue.push(node.right)
}
}
// 深度++
depth++
result.push(curLevel)
}
return result
}
标签:node,之字形,const,curLevel,BM27,tempQueue,遍历,二叉树,push
From: https://www.cnblogs.com/zx529/p/17019237.html