LeetCode 124. Binary Tree Maximum Path Sum 题解
题目描述
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
解题思路
方法:深度优先搜索(DFS)
思路:
- 使用深度优先搜索遍历二叉树
- 对于每个节点,计算以该节点为根的子树的最大贡献值(即从该节点出发的最大路径和)
- 同时,计算经过该节点的最大路径和(即左子树的最大贡献值 + 该节点的值 + 右子树的最大贡献值)
- 更新全局最大路径和
复杂度分析:
- 时间复杂度:O(n),其中 n 是二叉树的节点个数。每个节点只被访问一次。
- 空间复杂度:O(n),递归调用的栈空间取决于二叉树的深度,最坏情况下为 O(n)。
代码实现
方法:深度优先搜索(DFS)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxPathSum(self, root: Optional[TreeNode]) -> int:
self.max_sum = float('-inf')
def dfs(node):
if not node:
return 0
# 计算左子树的最大贡献值(如果为负,则取 0,表示不选左子树)
left_gain = max(dfs(node.left), 0)
# 计算右子树的最大贡献值(如果为负,则取 0,表示不选右子树)
right_gain = max(dfs(node.right), 0)
# 计算经过当前节点的最大路径和
current_sum = node.val + left_gain + right_gain
# 更新全局最大路径和
self.max_sum = max(self.max_sum, current_sum)
# 返回以当前节点为根的子树的最大贡献值
return node.val + max(left_gain, right_gain)
dfs(root)
return self.max_sum
测试用例
测试用例 1:
输入:root = [1,2,3]
输出:6
测试用例 2:
输入:root = [-10,9,20,null,null,15,7]
输出:42
测试用例 3:
输入:root = [1]
输出:1
测试用例 4:
输入:root = [-3]
输出:-3
总结
本题是二叉树的经典问题,主要考察对二叉树遍历和递归的理解和应用。通过使用深度优先搜索,我们可以高效地计算二叉树的最大路径和。
深度优先搜索的核心思想是:对于每个节点,计算以该节点为根的子树的最大贡献值,同时计算经过该节点的最大路径和,并更新全局最大路径和。
这种方法不仅适用于二叉树的最大路径和问题,还可以应用于许多其他需要遍历二叉树并计算路径和的场景。掌握深度优先搜索的思想,对于解决这类问题非常重要。

1万+

被折叠的 条评论
为什么被折叠?



