返回
LeetCode 124:二叉树中的最大路径和:探索通往最优解的路径
前端
2023-11-06 23:10:49
引言
在二叉树的世界中,路径被定义为从任意节点出发,沿着父节点-子节点连接,达到任意节点的序列。LeetCode 124 挑战我们找到二叉树中最大路径和,它可以从树中的任何节点开始和结束。
动态规划方法
计算二叉树最大路径和的经典方法是动态规划,它是一种自底向上的技术,将问题分解为较小的问题。对于每个节点,我们考虑以下两种情况:
- 节点本身成为路径末端: 在这种情况下,路径和为该节点的值。
- 节点成为路径中间的一部分: 在这种情况下,路径和为该节点的值加上从其子节点返回的最大路径和。
我们使用以下状态函数 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 难题,还能提高您对树形结构的理解和算法解决问题的技能。