返回
LeetCode 107:二叉树的层序遍历 II 的 Python 实现
IOS
2024-02-19 13:00:02
导言
在计算机科学中,二叉树是一种重要的数据结构,广泛应用于各种算法和数据存储场景中。LeetCode 107:二叉树的层序遍历 II 是一个经典的算法问题,它要求我们对给定的二叉树进行层序遍历,并逐层存储节点值。
问题
给定一棵二叉树,设计一个算法从上到下逐层遍历这棵树,并按层顺序存储每个节点的值。
Python 实现
def levelOrderBottom(root):
if not root:
return []
queue = [root]
result = []
while queue:
level_size = len(queue)
level_values = []
for _ in range(level_size):
node = queue.pop(0)
level_values.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.insert(0, level_values)
return result
算法详解
我们的算法遵循广度优先搜索 (BFS) 的策略来层序遍历二叉树。
-
初始化: 我们从根节点开始,并将其放入一个队列中。同时,创建一个空列表
result
来存储每一层的节点值。 -
BFS 遍历: 我们使用一个循环来遍历队列中的节点。在每次循环中,我们执行以下步骤:
- 弹出当前节点: 从队列中弹出当前正在处理的节点。
- 存储节点值: 将当前节点的值添加到
level_values
列表中。 - 添加子节点: 如果当前节点有左子节点或右子节点,则将它们添加到队列中。
-
存储层级结果: 当我们遍历完一层中的所有节点后,我们将
level_values
列表添加到result
列表的开头。这样做可以确保按层顺序存储节点值。 -
重复以上步骤: 我们重复步骤 2 和 3,直到队列为空,这意味着我们已经遍历了整个二叉树。
代码分析
- 时间复杂度: O(N),其中 N 是二叉树中的节点数。BFS 算法访问了每个节点一次。
- 空间复杂度: O(N),因为队列在最坏情况下可能存储整个二叉树的节点。
扩展与应用
层序遍历二叉树在各种场景中都有应用,例如:
- 计算二叉树的高度: 通过跟踪层数,我们可以计算二叉树的高度。
- 检查二叉树是否为完全二叉树: 完全二叉树的每一层都必须填满,层序遍历可以帮助我们检查这一点。
- 序列化和反序列化二叉树: 层序遍历可以帮助我们以按层顺序存储二叉树,以便在需要时轻松重建它。
总结
LeetCode 107:二叉树的层序遍历 II 算法要求我们从上到下逐层遍历二叉树,并按层顺序存储每个节点的值。通过使用广度优先搜索 (BFS) 的策略,我们可以高效地解决这个问题。本文提供了 Python 语言的详细代码示例和算法解释,帮助您掌握此算法。