给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3输出: 6
示例 2:输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7输出: 42
对于树中的每个点,递归计算完左右子树后,我们将左右子树维护的两条最大路径,和该点拼接起来,就可以得到以这个点为割点的最大路径。
对于每个结点来说,要知道经过其左孩子结点的 path 之和大还是经过右孩子节点的 path 之和大,递归函数dfs保存较大的path和值作为这个节点的返回值。递归函数返回值就可以定义为以当前结点为根结点,到叶节点的最大路径之和(左侧路径或者右侧路径)。
在递归函数中,如果当前结点不存在,直接返回0。否则就分别对其左右子节点调用递归函数,由于路径和有可能为负数,这里当然不希望加上负的路径和,所以和0相比,取较大的那个,就是要么不加,加就要加正数。然后来更新全局最大值结果 res,就是以左子结点为终点的最大 path 之和加上以右子结点为终点的最大 path 之和,还要加上当前结点值,这样就组成了一个条完整的路径。而返回值是取 left 和 right 中的较大值加上当前结点值,因为返回值的定义是以当前结点为终点的 path 之和,所以只能取 left 和 right 中较大的那个值,而不是两个都要。
参考链接:https://www.cnblogs.com/grandyang/p/4280120.html
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
import sys
class Solution(object):
def __init__(self):
self.ans=-sys.maxsize
def dfs(self,root):
if not root:
return 0
# 如果该节点为负数,相当于不要这个节点
left=max(0,self.dfs(root.left))
right=max(0,self.dfs(root.right))
self.ans=max(self.ans,left+right+root.val)
return max(left,right)+root.val
def maxPathSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.dfs(root)
return self.ans