一开始拿到这道题,我就想着递归,思路如下:
left=maxPathSum(root.left)
right=maxPathSum(root.right)
但是怎么把左右两边递归的值联系起来呢?如果能求出每个从左到右经过root的path的和,那么,再跟左右递归的结果一比较就可以求得最大值。
根据以上思路,我们可以定义一个函数pathSum,该函数也是求path的和,但是这个path必须包含root节点,而且这个path最多只能包括path的左右孩子节点中的一个。为什么只能包含left和right其中之一呢?因为如果既能包含left,也能包含right,那么left的路径就可能从left.left拐到left.right,没法经过root。这样一来我们就可以求出左孩子、经过root,到右孩子这种path的值。如下图所示:
我们可以边递归边寻找最大值,但注意结果中要包含Left-Root-Right这样的路径的值,这样的值其实就是max(pathSum(Left),0,pathSum(Right),pathSum(Left)+pathSum(Right))。代码如下:
class Solution(object):
ans=-2**31
def maxSum(self,root):
if root==None: return(0)
left=self.maxSum(root.left)
right=self.maxSum(root.right)
self.ans=max(self.ans,max(left,right,0,left+right)+root.val)
return(max(left,right,0)+root.val)
def maxPathSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root==None: return(-2**31)
self.ans=root.val
self.maxSum(root)
return(self.ans)
蠡口124. Binary Tree Maximum Path Sum
原文:https://www.cnblogs.com/Leisgo/p/11717554.html