📅  最后修改于: 2023-12-03 15:06:19.939000             🧑  作者: Mango
二叉树中的最大路径和是指二叉树中任意路径中节点值和的最大值,这个路径可以从任意节点到任意节点,但是不能重复经过同一个节点。
例如,给定如下二叉树:
1
/ \
2 3
其中,最大路径和为 6,因为路径 2->1->3 的节点值和为 6。
这是一道经典的树形DP题目,我们可以采用递归的方式处理二叉树中的最大路径和。
对于二叉树中的每个节点,我们可以把它的最大路径和分成两个部分:
root.val + leftPathSum + rightPathSum
,其中 leftPathSum
表示以左子节点为起点的最大路径和,rightPathSum
表示以右子节点为起点的最大路径和;max(leftMaxPathSum, rightMaxPathSum)
。对于每一个节点,我们都求出这两个值,然后取它们的最大值作为当前节点的最大路径和。而递归终止条件是节点为空时返回0。
下面是Python的代码实现,其中变量 self.ans
表示当前二叉树的最大路径和。
class Solution:
def __init__(self):
self.ans = float('-inf')
def maxPathSum(self, root: TreeNode) -> int:
def dfs(node):
if not node:
return 0
left_path_sum = max(0, dfs(node.left))
right_path_sum = max(0, dfs(node.right))
self.ans = max(self.ans, node.val + left_path_sum + right_path_sum)
return node.val + max(left_path_sum, right_path_sum)
dfs(root)
return self.ans
对于每个节点,我们需要计算 leftPathSum
和 rightPathSum
,因此时间复杂度为 $O(n)$,其中 $n$ 表示二叉树中节点的个数。
递归的时候,我们需要同时保存每个节点的 leftMaxPathSum
和 rightMaxPathSum
,因此空间复杂度为 $O(n)$。