二叉树中的最大路径和
题目描述
路径 被定义为一条从树中任意节点出发(并不是单纯的从叶子节点到根节点),沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
输入输出样例
样例一

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
样例二

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
题目解析
- dp+dfs
-
- 对于只有一个节点的树来说,答案就是其本身。
- 如果是如样例一所示的,非常简单的树树,那么就是1+2,1+3,1+2+3之间的最大值
- 如果是一个十分复杂的树,那么对于当前树,且经过根节点的最大路径是左子树过其根节点最大值+根节点,右子树子树过其根节点最大值+根节点,左子树过其根节点最大值+根节点+右子树子树过其根节点最大值。
- 注意:为什么要强调过根节点所有路径的最大值,因为要想一直往上求则必须要通过根节点实现连接,因此必不可少需要一个全局变量来记录目前得到的最大路径(这个变量不会受到根节点的牵制)
- 上述的注意这是这道题的关键!!!
代码实现
class Solution:
def __init__(self):
self.maxsum=float('-inf')#定义全局变量
def maxPathSum(self, root: TreeNode) -> int:
def dfs(node):
if not node:
return 0
left=max(dfs(node.left),0)
right=max(dfs(node.right),0)
self.maxsum=max(self.maxsum,left+node.val,right+node.val,left+node.val+right)
return max(left+node.val,right+node.val)
'''
这里为什么没有返回left+node.val+right
因为左+根+右 如果传上去,会导致上面过过根节点的路径无法实现
如样例二:如果返回了15+20+7,那么上面再选-10,能组成路径吗?
'''
dfs(root)
return self.maxsum