蠡口124. Binary Tree Maximum Path Sum

一开始拿到这道题,我就想着递归,思路如下:

  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)

猜你喜欢

转载自www.cnblogs.com/Leisgo/p/11717554.html