二叉树中的最大路径和-递归

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例 1:

输入:root = 1,2,3

输出:6

解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:

输入:root = -10,9,20,null,null,15,7

输出:42

解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

树中节点数目范围是 1, 3 \* 1 0 4 10\^4 104

-1000 <= Node.val <= 1000

python 复制代码
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

if __name__ == '__main__':
    s = Solution()
    print(s.maxPathSum(TreeNode(-10, TreeNode(30), TreeNode(20, TreeNode(15), TreeNode(7)))))

最大的路径和肯定是一条包含节点左右子树的路径,这个节点是这个路径的根节点(23,25行),但除了这个节点以外,路径上的其他节点只能有一棵子树(28行)

相关推荐
15709251134几秒前
优先队列:从Java源码到实战
开发语言·python
zzzll11114 分钟前
SpringBoot 入门与实践指南
java·spring boot·后端
jinyishu_26 分钟前
C++继承与多态进阶
开发语言·c++·程序人生
程序猿编码35 分钟前
用 C++ 从零写一个能训练的 GPT:标量自动微分 + Arena 内存池
开发语言·c++·gpt·transformer·模型推理
小灰灰搞电子1 小时前
Qt 队列容器 QQueue 的详解与示例
开发语言·qt·qqueue
男孩李1 小时前
浅谈Linux的last命令
java·linux·服务器
豆瓣鸡1 小时前
算法日记 - Day5
java·算法
掉鱼的猫1 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·serverless
学者猫头鹰1 小时前
对象存储:MinIO / 阿里云OSS
java
ACP广源盛139246256731 小时前
GSV6155@ACP# Type-C 视频信号转换芯片:技术架构、工程痛点适配与落地场景分析
大数据·c语言·开发语言·人工智能·分布式·嵌入式硬件·架构