lintcode练习 - 94. 二叉树中的最大路径和

94. 二叉树中的最大路径和

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)

样例

给出一棵二叉树:

       1
      / \
     2   3 

返回 6

解题思路:

找二叉树中的最大路径和,首先要考虑清楚是从上往下找,还是从下往上找,通过观察树的结构, 我们发现从下到上最好找。如果从下往上找呢,利用递归可以解决这个问题。

1、最优子结构

因为树是由一个个更小的结点树组成,所以我们可以把问题分解成一个个更小的树。

当树的结点只有一个时,最大的路径就是他自身,让树的高度为2时,根节点的最大路径为左右结点中的最大值加上根节点本身的值:max(l, r) + root.val, 如果左右结点都为负数,还没有自身的值大呢,所以我们取其中的最大值。max_single = max(max(l, r) + root.val, root.val)

知道了二叉树的最优左右路径,我们需要比较整体路径,max_top = max(max_single, l+r+root.val)。

再将以该结点为根节点的二叉树的最大路径和,和全局的路径和比较,取两者最大值,res = max(res, max_top)

2、重叠子问题

从下往上走,当底层的最优路径找出来了, 上一层结点就能直接用下一层的结果,依次向上递推,求解过程都简化成了对若干个个高度为2 的二叉树的操作。当递归完成时,根节点的值就是整颗二叉树的最大路径和。

"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""

class Solution:
    """
    @param root: The root of binary tree.
    @return: An integer
    """
    def maxPathSum(self, root):
        # write your code here
        self.res = float('-inf')
        
        self.findMaxUtil(root)
        return self.res
    
    #利用递归,从下到上开始寻找最优值
    def findMaxUtil(self, root):
        if root is None:
            return 0
        
        l = self.findMaxUtil(root.left)
        r = self.findMaxUtil(root.right)
        
        #下一级到上一级的最优解
        #下一级的最优解和自身相比,如果下一级没有,或者都为负数,则为自身
        max_single = max(max(l, r) + root.val , root.val)
        
        #Max top表示所考虑是以该结点为根的路径和
        max_top = max(max_single, l+r+root.val)
        
        #更新整个树中的最大路径和
        self.res = max(self.res, max_top)
        
        return max_single
        
        
            
 

你可能感兴趣的:(#,lintcode,#,动态规划,python,#,算法,#,lintcode练习笔记)