二叉树中的最大路径和


二叉树中的最大路径和

题目描述

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

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

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

输入输出样例

样例一
img
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
样例二
img
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

题目解析

  • dp+dfs
    • 对于只有一个节点的树来说,答案就是其本身。
    • 如果是如样例一所示的,非常简单的树树,那么就是1+2,1+3,1+2+3之间的最大值
    • 如果是一个十分复杂的树,那么对于当前树,且经过根节点的最大路径是左子树过其根节点最大值+根节点右子树子树过其根节点最大值+根节点左子树过其根节点最大值+根节点+右子树子树过其根节点最大值
  • 注意:为什么要强调过根节点所有路径的最大值,因为要想一直往上求则必须要通过根节点实现连接,因此必不可少需要一个全局变量来记录目前得到的最大路径(这个变量不会受到根节点的牵制
  • 上述的注意这是这道题的关键!!!

代码实现

class Solution:
    def __init__(self):
        self.maxsum=float('-inf')#定义全局变量
    def maxPathSum(self, root: TreeNode) -> int:
        def dfs(node):
            if not node: 
                return 0
            left=max(dfs(node.left),0)
            right=max(dfs(node.right),0)
            self.maxsum=max(self.maxsum,left+node.val,right+node.val,left+node.val+right)
            return max(left+node.val,right+node.val)
            '''
            这里为什么没有返回left+node.val+right
            因为左+根+右 如果传上去,会导致上面过过根节点的路径无法实现
            如样例二:如果返回了15+20+7,那么上面再选-10,能组成路径吗?
            '''
        dfs(root)
        return self.maxsum


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM