【一天一大 lee】二叉树的锯齿形层序遍历 (难度:中等) - Day20201222
题目:
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
抛砖引玉
关于二叉树的按层遍历之前已经做过类似的题目:
二叉树的层序遍历二叉树的层次遍历 II
广度优先搜索(BFS)按层遍历模板:
let _result = [],
queue = []
if (root == null) return []
queue.push(root)
while (queue.length) {
let len = queue.length,
levelNodes = []
for (let i = 0; i < len; i++) {
let node = queue.shift()
levelNodes.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
_result.push(levelNodes)
}
return _result
取二叉树节点放到队列中,每次遍历队列(清空队列)将队列中节点取出,节点值存放到新数组中, 再将取出的节点的子节点放入队列中。
本题中要求遍历顺序,每次顺序与上一次想法,则可以通过已经遍历的层数的奇偶来切换该层元素的排列顺序
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var zigzagLevelOrder = function(root) {
let _result = [],
queue = []
if (root == null) return []
queue.push(root)
while (queue.length) {
let len = queue.length,
levelNodes = []
for (let i = 0; i < len; i++) {
let node = queue.shift()
levelNodes.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
// 根据已遍历的层数切换元素的排列顺序
_result.length % 2
? _result.push(levelNodes.reverse())
: _result.push(levelNodes)
}
return _result
}
博客: 前端小书童