相当于DP:
设 dp[C] 代表以当前节点为结尾的最大上升路径和, 则我们需要对节点的左右子树做一个选择,
有dp[C] = max(max(dp[L], 0), max(dp[R], 0)) + C.val
当前节点的最大上升路径和等于它左右子树里最大的上升路径和加上当前节点的值
总的最大路径和就等于当前节点左边的最大上升路径和加上右边的
def maxPathSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
self.max_value = root.val #辅助方法外定义一个最大值,就是根节点的值
def post(root):
if not root: #空节点为0
return 0
left_val = max(0,post(root.left)) #左子树的最大上升路径和
right_val = max(0,post(root.right)) #右子树的最大上升路径和
value = left_val + right_val + root.val #当前节点的最大路径等于它左边的左边的最大上升路径和加上右边的
self.max_value = max(self.max_value,value)#更新最大值
return root.val + max(left_val,right_val) #当前节点的最大上升路径和等于它左右子树里最大的上升路径和加上当前节点的值
post(root)
return self.max_value