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

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

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

给你一个二叉树的根节点 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行)

相关推荐
毕设源码-郭学长7 分钟前
【开题答辩全过程】以 基于vue+springboot的校园疫情管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
中国lanwp15 分钟前
Tomcat 中部署 Web 应用
java·前端·tomcat
岁忧24 分钟前
(LeetCode 每日一题) 36. 有效的数独 (数组、哈希表)
java·c++·算法·leetcode·go·散列表
JNNarrator32 分钟前
4.JVM对象创建与内存分配机制
java
郝学胜-神的一滴38 分钟前
策略模式:模拟八路军的抗日策略
开发语言·c++·程序人生·设计模式·策略模式
失散1344 分钟前
并发编程——11 并发容器(Map、List、Set)实战及其原理分析
java·架构·并发编程
秋难降1 小时前
结构型模式 “全家桶”:适配、装饰、代理…7 种模式让你的代码更 “有章法”
java·设计模式·程序员
yinke小琪1 小时前
Spring生态全家桶:从基础到微服务的演进与关联是什么?
java·后端·spring
大翻哥哥1 小时前
Python轻量化革命:用MicroPython构建边缘智能设备
开发语言·python
AAA修煤气灶刘哥1 小时前
微服务又崩了?5 招 + Sentinel 救场,后端小白也能学会
java·后端·spring cloud