news 2026/11/6 10:40:34

算法:二叉树最大路径和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法:二叉树最大路径和

核心解题思路

要理解这个算法,你需要明白二叉树中的任何一个节点在计算路径时,其实扮演了两个不同的角色:

1. 对“上级”(父节点)的角色:只能提供一条腿

当一个节点(比如 root)向它的父节点汇报工作时,它不能把“左+根+右”这个像拱桥一样的路径汇报上去。因为路径不能分叉,一条路径要想继续向上延伸,只能选择左边或者右边的一条路。

汇报值= root->val + max(左子树能提供的最大单边路径, 右子树能提供的最大单边路径)。

2. 对“全局答案”的角色:可以是路径的最高点(拐点)

一条路径可以在当前节点“拐弯”。也就是说,路径可以是 左子树 -> 当前节点 -> 右子树。

当前节点为拐点的最大路径和= 左子树最大贡献 + 右子树最大贡献 + root->val。

我们需要每遍历到一个节点,就计算一下以它为“拐点”的路径和是否比当前的全局最大值 ans 还要大。如果是,就更新 ans。

完整代码:

class Solution { public: int maxPathSum(TreeNode* root) { int ans = INT_MIN; // 初始化为一个最小值,防止题目全是负数节点时出错 dfs(root, ans); // 开始递归 return ans; // 返回最终找到的全局最大路径和 } // 注意这里 ans 是引用传递 (int &ans),这样递归中修改的都是同一个变量 int dfs(TreeNode *root, int &ans) { // 1. 递归终止条件(Base Case) // 如果节点为空,它对路径的贡献就是 0 if (root == nullptr) return 0; // 2. 递归计算左右子树的“最大贡献值” // 核心逻辑:max(0, ...) 是精华所在! // 如果子树计算出的路径和是负数(比如 -10),那我们不如不选那条路(即贡献为 0)。 // 这相当于“剪枝”,把负贡献的尾巴剪掉。 int left = max(0, dfs(root->left, ans)); int right = max(0, dfs(root->right, ans)); // 3. 计算“单边最大路径”(用于返回给父节点) // temp 代表:如果父节点想连我,我能提供的最大值。 // 我只能带上我左右孩子中较大的那一个(或者都不带,如果都是0)。 int temp = max(left, right) + root->val; // 4. 更新全局最大值(ans) // 这里原作者写了两行更新,其实逻辑涵盖了两种情况: // 第一行:更新单边路径的情况(比如路径只到当前节点为止,或者只连一边) ans = max(ans, temp); // 第二行:更新“拱桥”情况(最关键的一步) // 路径形态:左孩子 -> 当前节点 -> 右孩子 // 这代表路径在当前节点这里“拐弯”了,不再向父节点延伸。 ans = max(ans, left + right + root->val); // 5. 返回值 // 注意!这里必须返回 temp。 // 因为 dfs 函数的定义是“返回该节点能给父节点提供的最大单边路径”。 // 你不能返回“左+根+右”,因为那是一条死路(两头都堵住了),不能再连父节点了。 return temp; } };

输入: root = [1, 2, 3]

步骤演示:

  1. 处理节点 2 (左子叶):
    • left, right 都是 0 (因为无子节点)。
    • temp (汇报给父节点) = $0 + 0 + 2 = 2$。
    • 更新 ans:此时 ans 可能是 2 (视初始化和遍历顺序而定)。
    • 返回 2。
  2. 处理节点 3 (右子叶):
    • left, right 都是 0。
    • temp (汇报给父节点) = $0 + 0 + 3 = 3$。
    • 更新 ans:ans 更新为 3。
    • 返回 3。
  3. 处理节点 1 (根节点):
    • left = 2 (来自节点 2 的返回值)。
    • right = 3 (来自节点 3 的返回值)。
    • 计算拱桥路径 (拐点路径):$left + right + root->val = 2 + 3 + 1 = 6$。
    • 更新 ans:ans 变为6。
    • 计算返回值 (temp):max(2, 3) + 1 = 4 (这意味着如果 1 还有父节点,它会汇报 4)。

最终结果 ans = 6

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 8:16:45

【金融项目实战】2_金融项目 _项目介绍(重点)

文章目录 一、项目简介1.1 业务特性1.2 用户1.3 技术架构 二、项目核心业务流程 一、项目简介 1.1 业务特性 xx安享智慧理财项目是一个P2P的金融平台,P2P金融又叫P2P信贷,本项目采用国家政策允许的银行存管模式,为用户提供方便、快捷、安心…

作者头像 李华
网站建设 2026/11/5 12:23:21

阿里双11高并发系统架构设计核心技术全解(2026版)

现在Java面试,问的是越来越底层。作为一名合格的Java程序员不仅要能“上天”,还要能“入地”!上天是指高并发,缓存,大流量,大数据量,能在更高的层面解决问题,入地是指从JVM&#xff…

作者头像 李华
网站建设 2026/11/5 20:22:30

不得了!天玑AIGEO优化系统口碑排行背后的营销奥秘

行业痛点分析在当前天玑AIGEO优化系统领域,存在着诸多技术挑战。对于拥有线下门店或区域化业务的企业而言,精准营销落地困难是一大难题。传统广告投放缺乏数据支撑,难以精准匹配目标客群,导致曝光量分散、转化率低迷,大…

作者头像 李华
网站建设 2026/11/5 15:36:58

Claude Code 完整学习计划

👋 欢迎! 你好!欢迎来到 Claude Code 学习之旅。这份学习计划专门为初学者设计,用最简单、最直白的方式帮你掌握这个强大的 AI 编程助手。 不用担心,我们会一步一步来,保证你能看懂、学会! &a…

作者头像 李华
网站建设 2026/11/5 15:36:58

AI 时代,我们是在进化还是在“脑力外包”?

当代码只剩“一句话”:AI 正在批量杀死程序员,还是在帮我们“脱壳”? 最近技术圈最焦虑的话题,莫过于 AI 程序员。 从 Cursor 的爆火到各种“一句话生成 App”的短视频刷屏,不少同行都在调侃:“以后不用写代码了,直接写小作文吧。”但玩笑归玩笑,深夜关掉编辑器,我们…

作者头像 李华