1、层序遍历基础模板:从上到下依次遍历,下面代码可以作为解决层序遍历的基础结构
/**
* @param {TreeNode} root
* @returns {number[]}
*/
function levelOrder(root) {
if (!root) {
return []
}
let queue = [root]
let res = []
while (queue.length) {
let node = queue.shift()
res.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
return res
}
2、在 1 的基础上
// 从上到下打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行
// 例如 [3,9,20,null,null,15,7],
// 3
// / \
// 9 20
// / \
// 15 7
// 输出结果为:
// [
// [3],
// [9,20],
// [15,7]
// ]
示例:
function levelOrder (root) {
if (!root) {
return []
}
let queue = [root]
let res = []
while (queue.length) {
let temp = []
// 这里必须倒叙遍历,因为queue的length是一直在变的,
//所以遍历当前的长度应该是一个固定值
for (let i = queue.length; i > 0; i--) {
// 取出当前层的节点
let node = queue.shift()
temp.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
res.push(temp)
}
return res
}
3、在 2 的基础上
// 打印二叉树,只打印右侧能够看到的节点
// 例如 [3,9,20,null,null,15,7,16],
// 3
// / \
// 9 20
// / \
// 15 7
// /
// 16
// 输出结果为:
// [
// 3,20,7,16
// ]
示例:
function exposedElement (root) {
if (!root) {
return []
}
let queue = [root]
let res = []
while (queue.length) {
let lastVal = null
for (let i = queue.length; i > 0; i--) {
let node = queue.shift()
lastVal = node.val
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
if (lastVal) {
res.push(lastVal)
}
}
return res
}
4、N 叉树层序遍历:基于2
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]
示例:
function levelOrder (root) {
if(!root) {
return []
}
let queue = [root]
let res = []
while (queue.length) {
let temp = []
for (let i = queue.length; i > 0; i--) {
let node = queue.shift()
temp.push(node.val)
if (node.children.length) {
queue.push(...node.children)
}
}
res.push(temp)
}
return res
}