返回

图解 LeetCode——102. 二叉树的层序遍历:深入浅出的解决方案

后端

博客

前言

在学习编程的道路上,算法和数据结构是必不可少的基石。它们不仅是计算机科学的基础,也是解决现实世界问题的重要工具。LeetCode 是一个著名的在线算法题库,它为程序员提供了大量的算法练习题,帮助他们提高编程技能。

LeetCode 上的 102. 二叉树的层序遍历题目是一个经典的树形结构遍历问题。它要求我们从根节点开始,逐层地访问二叉树中的所有节点,并按照从左到右的顺序输出它们的键值。本篇文章将详细讲解这个题目,并提供多种解法,帮助读者深入理解层序遍历算法的原理和应用。

广度优先搜索(BFS)

广度优先搜索(BFS)是一种树形结构的遍历算法,它从根节点开始,逐层地访问二叉树中的所有节点。BFS 算法的实现非常简单,我们可以使用队列来存储当前要访问的节点,然后依次访问队列中的每个节点,并将其子节点入队。这样,我们就能够按照从左到右的顺序遍历二叉树中的所有节点。

def level_order(root):
  """
  使用广度优先搜索(BFS)算法对二叉树进行层序遍历。

  参数:
    root:二叉树的根节点。

  返回:
    一个包含二叉树中所有节点键值的列表。
  """

  # 创建一个队列来存储当前要访问的节点。
  queue = [root]

  # 创建一个列表来存储二叉树中所有节点的键值。
  values = []

  # 只要队列不为空,就继续遍历二叉树。
  while queue:
    # 将队列中的第一个节点出队。
    node = queue.pop(0)

    # 将节点的键值添加到列表中。
    values.append(node.val)

    # 将节点的左子节点和右子节点入队。
    if node.left:
      queue.append(node.left)
    if node.right:
      queue.append(node.right)

  # 返回列表。
  return values

递归

递归是一种解决树形结构问题的一种非常自然的方法。我们可以使用递归算法来对二叉树进行层序遍历,方法是先访问根节点,然后递归地访问其左子节点和右子节点。这样,我们就能够按照从左到右的顺序遍历二叉树中的所有节点。

def level_order(root):
  """
  使用递归算法对二叉树进行层序遍历。

  参数:
    root:二叉树的根节点。

  返回:
    一个包含二叉树中所有节点键值的列表。
  """

  # 创建一个列表来存储二叉树中所有节点的键值。
  values = []

  # 调用 helper 函数来进行层序遍历。
  _level_order_helper(root, 0, values)

  # 返回列表。
  return values


def _level_order_helper(node, level, values):
  """
  使用递归算法对二叉树进行层序遍历的辅助函数。

  参数:
    node:当前要访问的节点。
    level:当前所在的层数。
    values:一个列表来存储二叉树中所有节点的键值。
  """

  # 如果当前节点为空,则直接返回。
  if not node:
    return

  # 如果当前节点是第一层,则将其键值添加到列表中。
  if level == 0:
    values.append(node.val)

  # 递归访问左子节点和右子节点。
  _level_order_helper(node.left, level + 1, values)
  _level_order_helper(node.right, level + 1, values)

总结

  1. 二叉树的层序遍历题目是一个经典的树形结构遍历问题,它要求我们从根节点开始,逐层地访问二叉树中的所有节点,并按照从左到右的顺序输出它们的键值。本篇文章提供了两种解法,分别是广度优先搜索(BFS)和递归。这两种解法的实现都非常简单,读者可以根据自己的喜好选择一种方法来解决这个问题。