【Leetcode】124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)

No124. 二叉树中的最大路径和

题目

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

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

给你一个二叉树的根节点 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 * 104]
  • -1000 <= Node.val <= 1000

思路:

总体采用递归的思想,递归中包含了迭代的思想,一共要做两个事:

  • 承上启下
  • 维护最大值res

具体而言:

  • 在每层递归函数中,首先比较res和当前值(left+right+node.val),若小于则进行维护,注意这里的递归体现在求解左右子树的最大权重中,这里注意要对小于0的结果进行断尾操作;
  • 在递归函数的最后要返回可供上层调用的最大权重值(node.val + max(left,right)

解题代码(Python3)

class Solution:
    def __init__(self):
        self.res = -float('inf')
    def maxPathSum(self, root: TreeNode) -> int:
        #递归
        def getNodeMaxPathSum(node):
            if node == None:
                return 0
            left = max(getNodeMaxPathSum(node.left),0)
            right = max(getNodeMaxPathSum(node.right),0)
            self.res = max(self.res,node.val + left + right)
            return node.val + max(left,right)
        getNodeMaxPathSum(root)
        return self.res

复杂度分析:

  • 时间复杂度O(n)
  • 空间复杂度O(h) 递归需要存树的深度

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/113748141