返回

515. 在每个树行中找最大值:LeetCode上的树木探险之旅

前端

攀上二叉树的高峰,探索层层宝藏

踏上二叉树的探险之旅,犹如攀登巍峨高山,每一层都是一次探险,而目标则是挖掘每一层的最大值,就如同寻找失落的宝藏。在这场探索中,我们将采用层序遍历的方式,一步步揭开二叉树的奥秘,找出那些深藏其中的价值。

层序遍历:步步为营

我们的旅程从根节点开始,采用层序遍历的方式进行。在这场探索中,队列将成为我们的忠实伙伴,它将存储着每一层等待探索的节点。我们将依次出队并访问这些节点,同时将它们的子节点入队,如此循环,直到队列为空,标志着我们已经征服了二叉树的每一层。

比较值域:寻找宝藏

在遍历每一层时,我们将比较每个节点的值,找出其中最大的一个,即该层中的最大值。就如同探险家在层层攀登中寻找最耀眼的宝石,我们也在二叉树中寻找着每一层的价值之最。

层层叠加:构建答案

随着我们攀登的深入,我们将把每一层的最大值收集起来,存入一个数组中,就像将找到的宝藏一层一层堆叠起来。最终,当我们到达二叉树的顶峰时,这个数组将成为我们探索成果的载体,承载着每一层的最珍贵财富。

代码示例:探险家的秘笈

def find_largest_values_in_tree_rows(root):
  """
  返回二叉树每一层中的最大值。
  """
  # 用队列存储待访问的节点
  queue = [root]
  # 用数组存储每一层的最大值
  max_values = []

  while queue:
    # 取出当前层的节点
    current_level_nodes = queue

    # 清空队列,以便存储下一层的节点
    queue = []

    # 记录当前层中的最大值
    current_level_max = float('-inf')

    # 遍历当前层的节点,比较值域,找出最大值
    for node in current_level_nodes:
      current_level_max = max(current_level_max, node.val)

      # 如果该节点有子节点,将其加入队列,以便下一层遍历
      if node.left:
        queue.append(node.left)
      if node.right:
        queue.append(node.right)

    # 将当前层中的最大值添加到答案数组
    max_values.append(current_level_max)

  return max_values

结语:满载而归的宝藏

完成了二叉树的探索,就像凯旋而归的探险家,我们满载着每一层的宝藏——最大值。这些宝藏不仅是二叉树的价值体现,更是一个个解题的明证,见证着我们的探索足迹和思考历程。

常见问题解答

Q1:为什么采用层序遍历的方式?
A1:层序遍历可以帮助我们逐层探索二叉树,确保每一层的最大值都能被正确识别。

Q2:如何比较每个节点的值?
A2:在遍历每一层时,我们将使用 max() 函数比较每个节点的值,找出其中最大的一个。

Q3:代码中的 float('-inf') 是做什么用的?
A3:float('-inf') 是一个负无穷大值,用作初始最大值,确保在比较时不会被任何节点的值超过。

Q4:探索二叉树还有什么其他方法?
A4:除了层序遍历,还有深度优先搜索(DFS)、前序遍历和中序遍历等其他方法可以探索二叉树。

Q5:如何处理空二叉树的情况?
A5:如果二叉树为空,则直接返回一个空列表即可。