返回

从上到下打印二叉树 II:揭秘分层遍历算法的奥秘

前端

序言:

身处科技浪潮之中,算法已成为不可或缺的利器。作为算法修炼场之一的 leetcode,吸引着众多程序员不断挑战自我。今天,让我们共同探索剑指 Offer 32 - II 这道经典题目,揭开分层遍历算法的神秘面纱。

一、二叉树的结构与遍历:

二叉树是一种数据结构,由结点和边构成。每个结点包含一个数据域和最多两个子结点,分别称为左子结点和右子结点。二叉树的遍历有不同的方式,分层遍历是一种常见的遍历方式。

二、分层遍历算法:

分层遍历算法的目标是按层级顺序访问二叉树中的所有结点。其核心思想是使用队列数据结构,将结点按照层级依次入队和出队。具体步骤如下:

  1. 初始化队列,并把根结点入队。
  2. 循环执行以下操作,直到队列为空:
    • 将队首结点出队并访问。
    • 如果队首结点有左子结点,则将左子结点入队。
    • 如果队首结点有右子结点,则将右子结点入队。

三、剑指 Offer 32 - II 解题思路:

剑指 Offer 32 - II 要求分层遍历一棵二叉树,并返回每一层结点的值。我们可以直接套用分层遍历算法,实现步骤如下:

  1. 初始化队列,并把根结点入队。
  2. 创建一个结果列表,用于存储每一层结点的值。
  3. 循环执行以下操作,直到队列为空:
    • 获取当前队列的大小,表示当前层的结点数。
    • 创建一个临时列表,用于存储当前层的结点值。
    • 循环遍历当前层的结点数,执行以下操作:
      • 将队首结点出队并访问。
      • 把当前结点的值添加到临时列表中。
      • 如果当前结点有左子结点,则将左子结点入队。
      • 如果当前结点有右子结点,则将右子结点入队。
    • 把临时列表添加到结果列表中。
  4. 返回结果列表。

四、代码实现:

def level_order_ii(root):
    if not root:
        return []

    result = []
    queue = [root]

    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.append(level_values)

    return result

五、结语:

通过对剑指 Offer 32 - II 的深入剖析,我们不仅掌握了分层遍历算法的精髓,也为自己的算法技能库添上了一块新砖。算法的学习是一个不断探索和实践的过程,愿我们都能在算法的海洋中乘风破浪,不断提升自我。