返回

LeetCode 107:二叉树的层序遍历 II 的 Python 实现

IOS

导言

在计算机科学中,二叉树是一种重要的数据结构,广泛应用于各种算法和数据存储场景中。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) 的策略来层序遍历二叉树。

  1. 初始化: 我们从根节点开始,并将其放入一个队列中。同时,创建一个空列表 result 来存储每一层的节点值。

  2. BFS 遍历: 我们使用一个循环来遍历队列中的节点。在每次循环中,我们执行以下步骤:

    • 弹出当前节点: 从队列中弹出当前正在处理的节点。
    • 存储节点值: 将当前节点的值添加到 level_values 列表中。
    • 添加子节点: 如果当前节点有左子节点或右子节点,则将它们添加到队列中。
  3. 存储层级结果: 当我们遍历完一层中的所有节点后,我们将 level_values 列表添加到 result 列表的开头。这样做可以确保按层顺序存储节点值。

  4. 重复以上步骤: 我们重复步骤 2 和 3,直到队列为空,这意味着我们已经遍历了整个二叉树。

代码分析

  • 时间复杂度: O(N),其中 N 是二叉树中的节点数。BFS 算法访问了每个节点一次。
  • 空间复杂度: O(N),因为队列在最坏情况下可能存储整个二叉树的节点。

扩展与应用

层序遍历二叉树在各种场景中都有应用,例如:

  • 计算二叉树的高度: 通过跟踪层数,我们可以计算二叉树的高度。
  • 检查二叉树是否为完全二叉树: 完全二叉树的每一层都必须填满,层序遍历可以帮助我们检查这一点。
  • 序列化和反序列化二叉树: 层序遍历可以帮助我们以按层顺序存储二叉树,以便在需要时轻松重建它。

总结

LeetCode 107:二叉树的层序遍历 II 算法要求我们从上到下逐层遍历二叉树,并按层顺序存储每个节点的值。通过使用广度优先搜索 (BFS) 的策略,我们可以高效地解决这个问题。本文提供了 Python 语言的详细代码示例和算法解释,帮助您掌握此算法。