在学数据结构的时候,二叉树通常有三种遍历,分别是先序遍历,中序遍历,后序遍历。这些遍历其实都是深度优先遍历的一种变形,因此都是使用递归来解决
然而二叉树还有一种层序遍历
就是每一层输出节点
就拿LEETCODE 102这道题举例子
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
一开始拿到这题也是挺棘手的,但是我们可以很明确知道既然是一层层来遍历,就大概率不是递归来解决
我们需要对每一层都是从左往右来输出
因此可以借助队列这个数据结构
首先我们将根节点添加至队列
然后pop出来,再判断它是否有左孩子,如果有则添加至队列,最后再判断它是否有右孩子,如果有则添加至队列
然后进行下一轮的pop,循环往复,直到队列里面没有元素存在
这里我是用python实现的一版代码
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
levels = []
if not root:
return levels
queue = [root]
level = 0
while queue:
levels.append([])
level_length = len(queue)
for i in range(level_length):
popedNode = queue.pop(0)
levels[level].append(popedNode.val)
if popedNode.left:
queue.append(popedNode.left)
if popedNode.right:
queue.append(popedNode.right)
level += 1
return levels
这里队列实现我只是简单拿了个列表来模拟
你也可以在collections库里使用deque这个模块