返回

LeetCode 124:二叉树中的最大路径和:探索通往最优解的路径

前端

引言

在二叉树的世界中,路径被定义为从任意节点出发,沿着父节点-子节点连接,达到任意节点的序列。LeetCode 124 挑战我们找到二叉树中最大路径和,它可以从树中的任何节点开始和结束。

动态规划方法

计算二叉树最大路径和的经典方法是动态规划,它是一种自底向上的技术,将问题分解为较小的问题。对于每个节点,我们考虑以下两种情况:

  1. 节点本身成为路径末端: 在这种情况下,路径和为该节点的值。
  2. 节点成为路径中间的一部分: 在这种情况下,路径和为该节点的值加上从其子节点返回的最大路径和。

我们使用以下状态函数 maxPathSum(node) 来计算以给定节点为根的子树中的最大路径和:

maxPathSum(node):
  if not node:
    return 0
  
  left_max = maxPathSum(node.left)
  right_max = maxPathSum(node.right)
  
  max_path_sum_through_node = node.val + max(0, left_max) + max(0, right_max)
  max_path_sum = max(node.val, max_path_sum_through_node)
  
  return max_path_sum

循序渐进的示例

让我们考虑以下二叉树:

           10
          /  \
         2    15
               /  \
              7    20

使用我们的动态规划方法计算最大路径和:

根节点 10:

  • 成为路径末端:路径和为 10。
  • 成为路径中间的一部分:最大路径和为 10 + max(0, 2 + 7) + max(0, 15 + 20) = 44。

左子树 2:

  • 成为路径末端:路径和为 2。
  • 成为路径中间的一部分:最大路径和为 2 + max(0, 7) = 9。

右子树 15:

  • 成为路径末端:路径和为 15。
  • 成为路径中间的一部分:最大路径和为 15 + max(0, 20) = 35。

右子树 7:

  • 成为路径末端:路径和为 7。
  • 成为路径中间的一部分:最大路径和为 7。

右子树 20:

  • 成为路径末端:路径和为 20。
  • 成为路径中间的一部分:最大路径和为 20。

因此,二叉树的最大路径和为 44,从根节点 10 开始,经过左子树的 2 和 7,以及右子树的 15 和 20

结论

LeetCode 124 是一道经典的算法问题,可以通过动态规划方法优雅地解决。通过对每个节点计算以其为根的子树中的最大路径和,我们可以找到二叉树中的最大路径和。掌握这一算法不仅有助于解决 LeetCode 难题,还能提高您对树形结构的理解和算法解决问题的技能。