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