二叉树最大路径和(hard)

 二叉树最大路径和

题目:🔗

 分析:

这个分析思路来源于leetcode上一个非常清晰的解析。链接在这https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/comments/ @丁玉松

根据当前节点的角色,路径和可分为两种情况:

  1. 以当前节点为根节点
    • 当前节点为最大值
    • 当前节点+左子树为最大值
    • 当前节点+右子书为最大值
    • 当前节点+左子树+右子树为最大值
  2. 以当前节点为父节点的一个子节点(和父节点连接需要取单端的最大值)
    • 只有当前节点
    • 当前节点+左子树
    • 当前节点+右子书

ps: 不可能当前节点+左右子树,这样再和父节点连接,会出现分叉,导致重复走路径!这也是为什么返回时,只返回最后前3种情况,要获得全局最大值,需要尝试和父节点相连后的结果。

记住用一个变量记录全局最大路径值!

import sys
class Solution:
    # 终于知道怎么取最大值了  想哭!
    result = -sys.maxsize - 1
    
    def maxPathSum(self, root: TreeNode) -> int:
        # 二叉树最大路径和  等价于 图的最大路径和 等价于 图的多源最大路径和  问题是如何建邻接矩阵  二叉树建邻接矩阵 没搞过。。
        # 我记得当初看题解都看不太懂 
        # 从简单的开始  二叉树问题 其实就是
        self.maxValues(root)
        return self.result

    def maxValues(self, root):
        '''
        抛开皮肉看构造, 这tm不就是一道后续遍历题吗?  
        '''
        if not root:
            return 0
        rootVal = root.val
        # 拿到左子树的最大树
        leftValue = self.maxValues(root.left)
        # 拿到右子树的最大值
        rightValue = self.maxValues(root.right)
        
        val1 = rootVal + leftValue
        val2 = rootVal + rightValue
        val3 = rootVal + leftValue + rightValue
        
        # 求这4种情况的最大值 
        maxValue = max([val1, val2, val3, rootVal])
        # 记录目前的最大值
        self.result = max(self.result, maxValue)
        
        # 路径要和父节点关联,则需要去除情况4的最大值
        return max(rootVal, val1, val2)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值