注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路。
描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
解题思路
可以创建一个队列queue
,每次放入同一层级的节点,使用变量len
记录同一层级节点的个数,依次弹出队列中len
个节点,将这弹出的每个节点的值追加到临时数组temp
中,然后再将改节点的左右子节点(如果存在的话)追加到队列中,将同一层的节点都弹出后,将temp
追加到保存结果的数组result
中。
举个例子,假设有以下二叉树:
1
/ \
2 3
/ \ / \
4 5 6 7
初始化:首先把根节点push到队列queue
中,此时queue = [1], len=1
迭代:
- 节点1被弹出,值保存到
temp
中,此时temp = [1]
,queue = []
- 将节点1的左右子节点push到
queue
中,此时queue = [2,3]
,由于len
为1,且已经弹出了1个节点,因此可以将temp
追加到结果数组result
中,此时result = [ [1] ]
在上述的基础上继续迭代:
- 此时
queue = [2,3], len=2
- 节点2被弹出,值保存到
temp
中,此时temp = [2]
,queue = [3]
- 将节点2的左右子节点push到
queue
中,此时queue = [3,4,5]
- 节点3被弹出,值保存到
temp
中,此时temp = [2,3]
, - 将节点3的左右子节点push到
queue
中,此时queue = [4,5,6,7]
- 由于
len
为2,且已经弹出了2个节点,因此可以将temp
追加到结果数组result
中,此时result = [ [1] , [2,3] ]
后面的过程以此类推。
var levelOrder = function(root) {
// 用于存放最后结果的数组
let result = []
// 初始化队列,若 root 为 null,则队列直接为[], 不进行 while 循环,直接返回result
let queue = root ? [root] : []
// 只要队列中存在元素,则遍历,若不存在元素,说明树已经遍历完毕,退出
while(queue.length !== 0){
// 存放每一层元素
let temp = []
// 遍历 len 个元素,即遍历这一层的所有元素
for(let i = 0, len = queue.length; i < len; i++){
let node = queue.shift()
temp.push(node.val)
// 只有不为空的时候,才需要将子节点 push 到队列中
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
}
result.push(temp)
}
return result
};
代码中的for循环不能使用一下代码代替,因为queue的大小是在不断变化的
for(let i = 0; i < queue.length; i++)