一、题目描述
给定一个二叉树,请你返回按照其 层序遍历 的到的节点值。
注: 即逐层的,从左到右访问所有节点。
示例:
给定二叉树 [3, 9, 20, null, null, 15, 7]
3
/ \
9 20
/ \
15 7
返回其层次遍历的结果:
[
[3],
[9, 20],
[15, 7]
]
二、思路分析
层序遍历实际上就是广度优先遍历。
需要注意的在遍历的时候需要记录当前节点所处的层级,方便将其添加到不同的数组当中。
三、AC 代码
方法 1: 在迭代的队列中添加表示层的标识,然后通过标识来生成数组。
var levelOrder = function(root) {
if(!root) return [] // 边界判断
const q = [[root, 0]] // 队列
const res = [] // 返回的数组
// 当栈里还有内容的时候就执行代码块里的内容
while(q.length) {
const [n, l] = q.shift() // 取出队头的数据
// 根据层级添加数据
res[l]
? res[l].push(n.val)
: res[l] = [n.val]
// 判断是否有子节点,如果有则添加到队列当中
if(n.left) q.push([n.left, l + 1])
if(n.right) q.push([n.right, l + 1])
}
return res
}
方法 2: 该方法无需去记录和判断每层的层级标识。相对于上述方法运算速度更快,内存消耗更少。
var levelOrder = function(root) {
if(!root) return []
const q = [root]
const res = []
while(q.length) {
let length = q.length // 获取当前层所有数据的长度
const arr = [] // 初始化用来存储当前层的数组
res.push(arr) // 添加到 res 里面
// 当前层的数据还没有全部出队就执行代码块的内容
while(length--) {
const n = q.shift() // 取出队头的数据
arr.push(n.val) // 添加到当前层的数组中
// 判断是否有子节点,如果有则添加到队列当中
if(n.left) q.push(n.left)
if(n.right) q.push(n.right)
}
}
return res
}
四、总结
该问题主要的是如何去记录每个数据的层级的标识,只要你了解广度优先遍历以及队列该题就很容易了。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情