当前位置: 首页 > ai >正文

【算法】124.二叉树中的最大路径和--通俗讲解

通俗易懂讲解“二叉树的最大路径和”算法题目

一、题目是啥?一句话说清

在二叉树中找一条路径(任意节点序列,每个节点最多有一个父节点和一个子节点),使得路径上所有节点的值之和最大,这条路径不一定经过根节点,但至少包含一个节点。

示例:

  • 输入:二叉树,节点值可能为负
  • 输出:最大路径和,例如在二叉树 [-10,9,20,null,null,15,7] 中,最大路径和是 42(路径 15 → 20 → 7)

二、解题核心

使用递归方法,从叶子节点开始向上计算每个节点能提供的最大贡献值,同时在每个节点处计算以该节点为顶点的路径和,并更新全局最大路径和。 这就像每个节点向父节点报告“我能为你提供的最大价值是多少”,而父节点则结合左右孩子的报告计算“如果路径以我为中心,总和能有多大”。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 递归计算节点贡献值

  • 是什么:对于每个节点,递归计算以该节点为起点的最大路径和(即从该节点向下延伸的路径,只能选择左或右一条分支)。
  • 为什么重要:这提供了节点对父节点的贡献值,帮助父节点计算更长的路径。

2. 更新全局最大路径和

  • 是什么:在每个节点处,计算以该节点为顶点的路径和(即节点值 + 左子树贡献 + 右子树贡献),并用此更新全局最大值。
  • 为什么重要:最大路径和可能出现在任何节点为顶点的路径上,而不一定是根节点。

3. 处理负值贡献

  • 是什么:如果子树的贡献值为负,则选择不包含该子树(即贡献值取0),因为负贡献会减少总和。
  • 为什么重要:这确保了路径和不会被负值拖累,从而找到真正的最大值。

四、看图理解流程(通俗理解版本)

让我们用二叉树 [-10,9,20,null,null,15,7] 为例来可视化过程:

  1. 从叶子节点开始

    • 节点15:左贡献=0,右贡献=0,以15为顶点的路径和=15。报告给父节点的贡献值=max(15,0)=15。
    • 节点7:左贡献=0,右贡献=0,以7为顶点的路径和=7。报告贡献值=max(7,0)=7。
  2. 处理节点20

    • 左贡献=15(来自左子树15),右贡献=7(来自右子树7)。
    • 以20为顶点的路径和=20 + 15 + 7 = 42(这是全局最大路径和)。
    • 报告给父节点的贡献值=20 + max(15,7) = 20 + 15 = 35(因为只能选一条分支)。
  3. 处理节点9

    • 左贡献=0,右贡献=0(因为无子树),以9为顶点的路径和=9。
    • 报告贡献值=max(9,0)=9。
  4. 处理根节点-10

    • 左贡献=9(来自左子树9),右贡献=35(来自右子树20)。
    • 以-10为顶点的路径和=-10 + 9 + 35 = 34,但34 < 42,所以全局最大值仍是42。
    • 报告贡献值=-10 + max(9,35) = -10 + 35 = 25(但25>0,所以报告25?不,实际上如果贡献为负,应该返回0,但这里25是正数)。

注意:在计算贡献值时,如果贡献为负,我们返回0,表示不包含该分支。所以根节点-10的贡献值应该是 max(-10 + max(9,35), 0) = max(25,0)=25?但根据算法,我们直接计算节点值加左右贡献的较大值,但如果结果为负,则返回0。

实际上,在递归函数中,我们计算节点的贡献值时,如果左或右贡献为负,我们就不取(即取0),所以对于根节点-10,贡献值 = -10 + max(左贡献,0) + max(右贡献,0)?不对,递归函数返回的是从该节点向下延伸的最大路径和(只能选一条分支),所以对于根节点,贡献值 = -10 + max( max(左贡献,0), max(右贡献,0) )?但左贡献是9(正),右贡献是35(正),所以贡献值 = -10 + max(9,35) = 25?但25是正数,所以返回25。

但在更新全局最大值时,我们计算以节点为顶点的路径和:节点值 + max(左贡献,0) + max(右贡献,0)。对于根节点,就是 -10 + 9 + 35 = 34。

最终全局最大值是42,来自节点20。

五、C++ 代码实现(附详细注释)

#include <iostream>
#include
http://www.xdnf.cn/news/19502.html

相关文章:

  • DeepSeek-V3.1 模型 API 新特性拆解:逆向 + 火山双渠道适配与推理模式智能切换指南
  • 保健品跨境电商:如何筑牢产品质量与安全防线?
  • 【推荐】Maye 更轻更简洁的快速启动工具【优化桌面】
  • AutoSar RTE介绍
  • FOC+MCU:重新定义吸尘器电机控制——高效、静音、智能的终极解决方案
  • LeetCode199. 二叉树的右视图 - 解题思路与实现
  • Linux Tun/Tap 多队列技术
  • CCache使用指南
  • 0901 C++的动态内存分配与回收
  • 全局网络,一目了然——OpManager可视化监控全景体验
  • AI 智能体架构中的协议设计三部曲:MCP → A2A → AG-UI
  • uniApp App 嵌入 H5 全流程:通信与跳转细节拆解
  • 嵌入式ARM程序高级调试技能:22.malloc free 的wrap实现,free支持 align free
  • 【机器学习入门】5.1 线性回归基本形式——从“选西瓜”看懂线性模型的核心逻辑
  • [Java]PTA:jmu-java-01入门-基本输入
  • YOLO 目标检测:YOLOv3网络结构、特征输出、FPN、多尺度预测
  • 在 React Native 层禁止 iOS 左滑返回(手势返回/手势退出)
  • 每日算法题【二叉树】:二叉树查找值为x的节点、给定字符串用前序遍历构建二叉树、二叉树的销毁
  • Topaz Video AI:AI驱动的视频增强与修复工具
  • 如何选择单北斗变形监测系统才高效?
  • 【思考】WSL是什么
  • 深度学习环境搭建运行(一) Ubuntu22.04 系统安装 CUDA11.8 和 CUDNN8.6.0 详细步骤(新手入门)
  • AI 赋能 Java 开发效率:全流程痛点解决与实践案例(三)
  • 【先楫HPM5E00_EVK系列-板卡测评3】hpm5e00evk平台中断、定时器、PWM、USART等基础功能详解
  • NOSQL——Redis
  • Trae + MCP : 一键生成专业封面
  • @Autowired注入底层原理
  • STM32-FreeRTOS操作系统-任务创建
  • 洛谷 P5836 [USACO19DEC] Milk Visits S-普及/提高-
  • 贪心算法解决钱币找零问题(二)