以如下二叉树为例:
3
/ \
9 20
/ \
15 7
层序遍历的结果是按层次从上到下逐层访问节点,从左到右逐个节点。对于这个树,层序遍历的顺序为:
- 第一层:[3]
- 第二层:[9, 20]
- 第三层:[15, 7]
leetcode102:二叉树的层序遍历
代码实现(Python)
1、利用长度:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
queue = collections.deque([root])
result = []
while queue: # 存储该层结点的列表
level = []
for _ in range(len(queue)): # 该层长度
cur = queue.popleft() # 第一次时,只有一个根结点,这里队列已空
level.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
result.append(level)
return result
2、递归法:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
levels = []
def traverse(node, level): # node 是当前访问的节点,level 是当前节点所在的层级
if not node:
return
if len(levels) == level:
levels.append([])
'''
len(levels) 是当前已经遍历的层数的数量,而 level 是当前正在(准备开始)处理的层级,均从0开始
如果当前正在处理的层级 level 等于 levels 列表的长度,就说明这个层级还没有被加入到 levels 列表中,因此需要创建一个新的空列表来表示这一层。
例如,当第一次访问某一层(比如 level = 2,从 0 到 2,也就是第三层),levels 列表的长度是 2,此时 levels 中只有两层的数据。
即:如果 level 和 levels 列表(已有层数)的长度相等,说明这一层还没有被创建。
'''
levels[level].append(node.val)
'''
将当前节点的值 node.val 添加到对应的层级列表(对应的level)中。
'''
traverse(node.left, level + 1)
traverse(node.right, level + 1)
traverse(root, 0) # 开始递归遍历,从根节点(第0层)开始
return levels