给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
思路:
递归时,将每个结点作为一个根结点传入递归函数。对于当前的这个结点,以它为根结点,计算它左子树路径的最大和,右子树路径的最大和。通过这个结点,当前是看做是以它根结点,这个结点的最大路径和就是:左子树最大路径和(大于0的话)+右子树最大路径和(大于0的话)+根结点的值。然后更新当前计算的MAX是多少,也就是我们的结果。
递归函数的返回值是:当前这个结点的左子树最大路径和,或者是右子树最大路径和。再加上结点值。因为,这样得到的一条最大路径,就可以作为这个结点的父节点的一条路径,用于父节点的计算。
代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# 暴力解法:枚举2个节点,求节点之间的距离
# 1前序遍历 2.求根节点到所有的叶子节点的pathsum,遍历整棵树 3.求跟节点到叶子节点的最大深度,f(root) = f(left) .... f(right)
# 父节点的解只跟子节点有关系,不关系具体内部实现
# 左右子数分离,任意两个节点的问题可以抽象成最近公共祖先的问题
class Solution:
def maxPathSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.re = -2**31
self.robot(root)
return self.re
def robot(self,root):
if root == None:
return 0
left = max(0,self.robot(root.left))
right = max(0,self.robot(root.right))
self.re = max(self.re,root.val + left + right)
return max(root.val,root.val + max(left,right))