-
代码:
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def __init__(self): self.maxSum = float("-inf") def maxPathSum(self, root: TreeNode) -> int: def maxGain(node): if not node: return 0 # 递归计算左右子节点的最大贡献值 # 只有在最大贡献值大于 0 时,才会选取对应子节点 leftGain = max(maxGain(node.left), 0) rightGain = max(maxGain(node.right), 0) # 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值 priceNewpath = node.val + leftGain + rightGain # 更新答案 self.maxSum = max(self.maxSum, priceNewpath) # 返回节点的最大贡献值 return node.val + max(leftGain, rightGain) maxGain(root) return self.maxSum
-
思路:主要是想好其中递归的一个思想,其中递归重复的最要是计算某一个节点的最大贡献和,这个怎么计算呢?是当前节点与当前节点的左右子树的最大贡献和,具体来说就是,当前子节点为空,则直接返回0,如果不为空,则递归计算左右子节点的最大贡献值,计算出来后,还要与0作比较,因为如果左右节点的最大贡献值为负数的话,将毫无意义,所以只能选贡献值大于0的节点。然后要理解节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值,然后更新我们之前定义的最大和,这里要注意,我们当时初始化时,选取的值绝对不能是任意负数,这样的话很可能当节点值全为负数时就出错,这里要将其初始化为负无穷。然后直接返回节点的最大贡献值即可,将上面的一切封装为一个函数,然后我们直接将root传入其中即可,最后返回的是更新到最后的maxSum的值。顺便说一下,在本地调试的话,别忘了定义二叉树的结构。
-
PTT演示:
LeetCode0124
最新推荐文章于 2021-09-26 17:08:33 发布