递归:解释看注释
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxPathSum(self, root: Optional[TreeNode]) -> int:
self.maxsum = root.val
def maxBasedOnRoot(root):
if not root: return 0
left = max(0, maxBasedOnRoot(root.left))
# 如果包括左子树的根节点,即root.left的最长路径和为非正数,就取0,说明包括该结点root的最大路径选择不走左子树了,因为不能带来增益
right = max(0, maxBasedOnRoot(root.right))
# 如果包括右子树的根节点,即root.right的最长路径和也是小于0的,那就说明根节点root谁都不要走,就在自己这打止,此时收益最大。max(0,)的作用就是如此
self.maxsum = max(self.maxsum, root.val + left + right)
# 这里将root.val+left+right和maxsum比较,是在看以当前root为衔接点的最大路径和,此时的root可能不是整个二叉树的根节点,也就是说现在是在看《不经过根节点的路径和》有没有可能是最大的。
return root.val + max(left, right)
# 这里返回的是 包括该结点的路径的最大值,作为上面的某个根节点的某边子树的最大路径和。
max_rootPathSum = maxBasedOnRoot(root)
# 这个不一定是我们要的结果,因为结果路径可以不经过根节点。只是通过递归这个过程,让self.maxsum遍历以某个子树根节点为衔接点的路径,得到最大值
return self.maxsum