题目:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入:[1,2,3]
输出:6
示例 2:
输入:[-10,9,20,null,null,15,7]
输出:42
思路:递归。
参考官方题解
为每一个节点定义一个最大贡献值,表示以该节点为根节点的子树中,经过该节点的最大路径和。根据这个定义,空节点的贡献为0,非空节点的贡献是节点值加上左右子节点中较大的贡献,举例如下,节点旁边的值是该节点的最大贡献值:
这样,可以递归得到每一个节点的贡献值,同时,在递归的过程中,经过当前节点的最大路径和为,当前节点的值加上左右子节点的最大贡献(此处需要注意,如果子节点的贡献是负值,那我们选择不经过该子节点,也就是说不计入路径和)。维护一个最大路径和,在递归的过程中不断更新它。
代码:
# 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: TreeNode) -> int:
maxSum = float("-inf")
def getMaxSum(root):
nonlocal maxSum
if not root:
return 0
# 保证不取负值,例如[2, -1]
maxLeft = max(getMaxSum(root.left), 0)
maxRight = max(getMaxSum(root.right), 0)
maxCur = root.val + max(maxLeft, maxRight)
maxSum = max(maxSum, maxLeft + maxRight + root.val)
return maxCur
getMaxSum(root)
return maxSum