LeetCode0124

  1. LeetCode0124 二叉树的最大路径和

  2. 代码:

    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
    
  3. 思路:主要是想好其中递归的一个思想,其中递归重复的最要是计算某一个节点的最大贡献和,这个怎么计算呢?是当前节点与当前节点的左右子树的最大贡献和,具体来说就是,当前子节点为空,则直接返回0,如果不为空,则递归计算左右子节点的最大贡献值,计算出来后,还要与0作比较,因为如果左右节点的最大贡献值为负数的话,将毫无意义,所以只能选贡献值大于0的节点。然后要理解节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值,然后更新我们之前定义的最大和,这里要注意,我们当时初始化时,选取的值绝对不能是任意负数,这样的话很可能当节点值全为负数时就出错,这里要将其初始化为负无穷。然后直接返回节点的最大贡献值即可,将上面的一切封装为一个函数,然后我们直接将root传入其中即可,最后返回的是更新到最后的maxSum的值。顺便说一下,在本地调试的话,别忘了定义二叉树的结构。

  4. PTT演示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值