返回

筑梦程序的阡陌,携手 LeetCode 107 树的层次遍历

后端

编程世界中,数据结构与算法如同一把钥匙,开启着知识与创新的大门。LeetCode 第 107 题:树的层次遍历,是一个极具代表性的问题,它将算法与数据结构的应用完美融合,为程序员们提供了一个绝佳的学习与实践机会。

题目

在一个二叉树中,进行层次遍历,即从根节点开始,逐层遍历整个二叉树。

解决方案

为了解决这个问题,我们需要深入理解层次遍历的思想。层次遍历是一种广度优先搜索算法,它通过使用队列来存储待访问的节点,然后依次访问队列中的节点及其子节点,直到队列为空。

1. 深度优先搜索 vs. 广度优先搜索

在介绍算法之前,我们先来看看深度优先搜索和广度优先搜索的区别。

  • 深度优先搜索 :从根节点出发,依次访问所有子节点,直到叶子节点,然后再回溯到父节点,访问其下一个子节点。

  • 广度优先搜索 :从根节点出发,逐层访问所有节点,一层一层地往下遍历。

2. BFS 算法解析

了解了两种搜索算法后,我们再来看看广度优先搜索(BFS)算法在 LeetCode 107 中的具体实现步骤:

  • 创建队列 :将根节点入队,作为初始的待访问节点。

  • 循环遍历队列

    • 从队列中取出队首元素,访问该节点。

    • 如果该节点有子节点,将子节点入队。

    • 重复以上步骤,直到队列为空。

3. 代码实现

在 Python 中,我们可以使用 collections.deque() 来实现队列,并通过以下代码实现层次遍历算法:

def level_order_traversal(root):
  """
  Perform a level-order traversal on a binary tree.

  Args:
    root: The root node of the binary tree.

  Returns:
    A list of lists, where each inner list contains the values of the nodes in a level.
  """

  if root is None:
    return []

  queue = collections.deque([root])
  result = []

  while queue:
    level = []
    for _ in range(len(queue)):
      node = queue.popleft()
      level.append(node.val)
      if node.left:
        queue.append(node.left)
      if node.right:
        queue.append(node.right)
    result.append(level)

  return result

结语

LeetCode 107 树的层次遍历题,是一个经典的算法问题。掌握了这道题的解题方法,可以为程序员们在算法进阶的道路上提供坚实的基础。希望今天的分享能帮助您更深入地理解层次遍历算法的精髓,并将其应用到更广阔的编程领域。