对于任意一个节点node, 如果最大和路径包含该节点, 那么只可能是两种情况:
1. node的左右子树中所路径和较大的,加上node的值后向node父节点回溯构成最大路径(若向父节点回溯,则左右分支只能选一个,因为不能回路)
2. 左右子树都在最大路径中, 加上node的值构成了最终的最大路径。
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.maxSum = -sys.maxsize
self.getMax(root)
return self.maxSum
def getMax(self, root):
if not root:
return 0
left = self.getMax(root.left)
right = self.getMax(root.right)
self.maxSum = max(self.maxSum, left+right+root.val)
return max(left, right) + root.val
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.maxSum = -sys.maxsize #用一个全局maxSum记录最大路径和,先预设为最小整数
self.getMax(root)
return self.maxSum
def getMax(self, root):
if not root:
return 0
#对左右子树递归
left = max(0, self.getMax(root.left)) #如果子树路径和为负则应当置0表示最大路径不包含子树
right = max(0, self.getMax(root.right))
#判断在该节点包含左右子树的路径和是否大于当前最大路径和
self.maxSum = max(self.maxSum, root.val + left + right)
#注意!该节点对上一层的返回值,只能是该节点值加上左子树(或右子树),因为不可能产生回路
return root.val + max(left, right)