LC 124二叉树困难第 53 / 95 题

二叉树中的最大路径和

Binary Tree Maximum Path Sum

递归后序遍历负值剪枝
本机进度仅保存在当前浏览器

题目描述

二叉树中的「路径」被定义为一条节点序列,序列中每对相邻节点之间都存在边,且每个节点至多出现一次;路径至少包含一个节点,不必经过根节点。路径和是路径中各节点值的总和。给你二叉树的根节点 root,返回其最大路径和(节点值可能为负)。

示例:[1, 2, 3] 输出 6(路径 2 -> 1 -> 3);[-10, 9, 20, null, null, 15, 7] 输出 42(15 -> 20 -> 7)。

解题思路

  1. 区分两个量:「穿过当前节点的路径和」(左链 + 右链 + 自身,用于更新答案)与「向上贡献的链和」(自身 + 左右链中较大的一条,用于递归)。
  2. 链和若为负,贡献只会拖累父节点,取 max(链和, 0) 实现负值剪枝。
  3. 答案在递归过程中全局更新:ans = max(ans, left + right + val);注意至少包含一个节点,负值也要正确处理。

参考实现

查看参考实现Python · 建议先自行作答
def maxPathSum(root):
    best = float('-inf')

    def gain(node):
        # 返回以 node 为端点向下的最大链和(负贡献剪为 0)
        nonlocal best
        if not node:
            return 0
        left = max(gain(node.left), 0)
        right = max(gain(node.right), 0)
        best = max(best, node.val + left + right)
        return node.val + max(left, right)

    gain(root)
    return best

复杂度与归属

时间复杂度O(n)
空间复杂度O(h)
所属分类二叉树
题源LeetCode 124

关联教程

返回题图鉴