Leetcode-124-二叉树最大路径和-Python

这题表面是"求最大路径和",但难点在于路径不必经过根,而且可以从任意节点走到任意节点。如果只按"根到叶"的思路做,很容易漏掉最优答案。


一、构思:先想"枚举所有路径"可不可行?

直觉上,要找最大路径和,可以枚举所有路径:

  • 二叉树中任意两点之间只有一条简单路径
  • 如果有 n 个节点,所有点对路径数量约 n*(n-1)/2
  • 每条路径再求和 → 总复杂度大概 O(n^2) 甚至更高

结论:理论可行,但太慢(尤其 n=10^4 时直接爆炸)。

所以必须换思路,避免真正枚举所有路径。


二、关键一招:把"路径"拆成两类

这题的关键在于每个节点都可以做"拐点"。

在一个节点上,路径最多只能有三段:

左子树贡献 + 当前节点 + 右子树贡献

但注意:

  • 用于更新答案时,可以"左右都要"(把当前节点当拐点)
  • 返回给父节点时,只能选"左或右的一边",因为路径向上时不能分叉

这就是本题的"关键一招":

> 拐点路径用来更新全局最大值;单边路径用来向上返回贡献。


三、算法设计(一次 DFS 解决)

对每个节点 root 做 DFS,返回"单边最大贡献":

  1. 先拿到左/右子树的最大贡献
  1. 把负贡献当成 0(因为负数只会拉低)
  1. 用 左 + 根 + 右 更新全局最大值
  1. 返回 根 + max(左, 右) 给父节点

四、核心代码

python 复制代码
class Solution:
    def maxPathSum(self, root: Optional[TreeNode]) -> int:
        res = -1e12

        def dfs(root):
            nonlocal res
            if root is None:
                return 0

            leftMax = dfs(root.left)
            rightMax = dfs(root.right)

            # 1) 拐点路径:用于更新全局最大
            curSum = root.val
            if leftMax > 0:
                curSum += leftMax
            if rightMax > 0:
                curSum += rightMax
            res = max(res, curSum)

            # 2) 单边路径:用于向上返回
            singleSum = root.val + max(0, max(leftMax, rightMax))
            return singleSum

        dfs(root)
        return res

五、为什么不能只考虑"拐点路径"?

因为"拐点路径"只能用于更新答案,

但父节点要继续往上拼路径时,必须知道"当前节点能给的单边最大贡献"。

否则无法把路径接上去,结果就不完整。


六、与"枚举所有路径"的关系

你之前问过"枚举所有路径"的思路:

  • 枚举任意两点 → O(n^2)
  • 每条路径计算和 → O(n^3)(如果从头算)
  • 即便用前缀和/LCA优化,也很难降到 O(n)

而这道题用 DFS 的"关键一招",等价于在 O(n) 内隐式枚举了所有路径,但只保留对答案有贡献的部分。


七、复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(h)(递归深度)
相关推荐
灵感__idea13 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试