LeetCode 124题解析:二叉树最大路径和的动态规划解法

发布时间:2026/11/2 22:49:33

LeetCode 124题解析:二叉树最大路径和的动态规划解法 1. 题目解析与核心思路LeetCode 124题二叉树中的最大路径和是一个经典的树形动态规划问题。题目要求我们在一棵二叉树中寻找一条路径使得路径上所有节点值的和最大。这里的路径定义为任意节点序列序列中每对相邻节点之间都存在一条边且同一个节点在路径序列中至多出现一次。1.1 问题重述给定一棵二叉树的根节点root返回其最大路径和。路径不需要从根节点开始也不需要在叶子节点结束但必须保证路径是连续的。例如输入root [-10,9,20,null,null,15,7] 输出42 解释最优路径是15 → 20 → 7路径和为15207421.2 关键观察点解决这个问题的关键在于理解路径的构成方式。对于任意一个节点经过它的最大路径和可能有以下三种情况只包含该节点本身该节点加上左子树的某条路径该节点加上右子树的某条路径该节点加上左右子树的路径形成拐弯路径2. 树形DP解法详解2.1 递归定义我们定义一个递归函数maxGain(node)它返回以node为起点的向下延伸的最大路径和即不拐弯。同时在递归过程中我们会计算经过node的最大路径和可能拐弯并更新全局最大值。class Solution { public: int maxPathSum(TreeNode* root) { int maxSum INT_MIN; maxGain(root, maxSum); return maxSum; } private: int maxGain(TreeNode* node, int maxSum) { if (!node) return 0; // 递归计算左右子树的最大贡献值 int leftGain max(maxGain(node-left, maxSum), 0); int rightGain max(maxGain(node-right, maxSum), 0); // 计算经过当前节点的最大路径和可能拐弯 int priceNewPath node-val leftGain rightGain; // 更新全局最大值 maxSum max(maxSum, priceNewPath); // 返回当前节点的最大贡献值不拐弯 return node-val max(leftGain, rightGain); } };2.2 时间复杂度分析这个解法采用后序遍历的方式访问每个节点恰好一次因此时间复杂度是O(N)其中N是二叉树中的节点数量。空间复杂度取决于递归栈的深度最坏情况下树退化为链表为O(N)。3. 实现细节与边界处理3.1 初始值设置全局最大值maxSum初始化为INT_MIN这样可以正确处理所有节点值都为负数的情况。例如树中所有节点都是-1那么最大路径和应该是-1单个节点。3.2 负贡献处理在计算左右子树的贡献时我们使用max(..., 0)来忽略负贡献。这意味着如果某子树的贡献为负我们宁愿不选择它。3.3 空节点处理当节点为nullptr时maxGain返回0表示空子树没有贡献。4. 常见错误与调试技巧4.1 典型错误模式忘记处理负值情况导致计算结果偏大混淆了节点最大贡献值和经过该节点的最大路径和两个概念没有正确初始化全局最大值导致全负数情况出错4.2 调试建议对于树类问题建议构造以下测试用例单节点树全负数树完全二叉树退化为链表的树常规的平衡树例如void test() { Solution sol; // 单节点 TreeNode* t1 new TreeNode(5); assert(sol.maxPathSum(t1) 5); // 全负数 TreeNode* t2 new TreeNode(-3); t2-left new TreeNode(-5); t2-right new TreeNode(-1); assert(sol.maxPathSum(t2) -1); // 常规案例 TreeNode* t3 new TreeNode(-10); t3-left new TreeNode(9); t3-right new TreeNode(20); t3-right-left new TreeNode(15); t3-right-right new TreeNode(7); assert(sol.maxPathSum(t3) 42); }5. 算法优化与变种思考5.1 非递归实现虽然递归实现简洁但我们可以用后序迭代遍历来实现非递归版本。需要使用栈来模拟递归过程并额外维护每个节点的状态是否已处理左右子树。5.2 路径记录如果需要输出具体路径而不仅仅是和我们可以修改算法在递归过程中同时记录路径节点。这需要维护更多的状态信息但基本思路不变。5.3 多叉树扩展这个算法可以推广到多叉树情况。对于每个节点我们需要考虑所有子树的贡献选择最大的几个具体数量取决于路径定义来组合。6. 同类题目推荐LeetCode 543 - 二叉树的直径LeetCode 687 - 最长同值路径LeetCode 337 - 打家劫舍 IIILeetCode 1372 - 二叉树中的最长交错路径LeetCode 1026 - 节点与其祖先之间的最大差值这些题目都采用了类似的树形DP思路通过后序遍历在递归过程中维护和更新全局状态。掌握这个模式可以解决一大类二叉树路径问题。
延伸阅读

更多相关文章

2026/11/2 22:44:33

多Agent系统组织模型设计与实践指南

1. 多Agent系统组织模型设计概述在复杂问题求解领域,多Agent系统(MAS)正成为突破传统集中式架构局限的关键技术范式。这种由多个自主智能体组成的分布式网络,通过角色分工与协同机制,展现出处理开放性、动态性任务的独特优势。去年某电商平台…

2026/11/2 22:44:33

Higress 云原生网关实战:Envoy+Istio+Wasm 架构解析与性能调优

1. 从 Envoy 到 Higress:一个云原生网关的诞生逻辑第一次接触 Higress 是在一个内部服务治理项目里,当时我们面临一个很典型的问题:K8s 集群里跑着几十个微服务,南北向流量用 Nginx Ingress,东西向用 Istio&#xff0c…

2026/11/2 22:44:33

AI编程实测:Step 5、DeepSeek V4 Pro与GLM5.3生成3D迷宫游戏对比

如果你手头同时有几个大模型的API额度,多半也想干同一件事:让它们做同一个需求,看谁更像一个正经工程师。我上周就把Step 5 Preview、DeepSeek V4 Pro和GLM5.3拉到同一张考场上,题目统一——做一个能直接在浏览器里跑的3D迷宫逃脱…

2026/11/2 23:44:38

C++实现LeetCode(769.可排序的最大块数)

前言 LeetCode 第 769 题「最多能完成排序的块」给一个长度为 n 的数组,它是 0 到 n-1 的一个排列。要求把数组切成尽量多的连续块,对每块单独排序后,按原顺序拼接起来,结果等于整个数组升序排列。 题目的关键约束是「排列」&…

2026/11/2 23:44:38

麒麟V10内存不释放排查:drop_caches定时回收脚本与边界

简介:面向银河麒麟V10服务器运维场景的轻量脚本包,聚焦系统长时间运行后内存不释放、可用内存逐步下降的问题,适合需要快速落地定时清理与日常巡检方案的中初级运维人员参考。压缩包仅2KB,共3个文件,由2个sh脚本和1个t…

2026/11/2 23:44:38

快递驿站分发系统毕业设计跑通指南:环境、状态机与并发核销避坑

简介:面向计算机专业毕业生与Java初学者,这份菜鸟驿站快递分发系统毕业设计压缩包提供了一套可运行的管理系统完整方案。系统围绕快递入库、分发与查询等业务展开,从需求分析、总体设计到详细设计均有对应实现,涵盖功能结构、数据…

2026/11/2 23:44:38

HJ212协议解析实战:Java+Netty自定义协议拆包与CRC16校验

简介:面向环保监测系统开发者的 HJ212 协议 Java 解析示例包,聚焦《污染源在线自动监控(监测)系统数据传输标准》的数据编解码与通信处理,适合需要快速理解协议结构、在项目中接入污染物数据采集与转换的初中级 Java 工…

2026/11/2 23:44:38

Apache Pulsar 2.9.1 部署实战:单机、集群、多租户与避坑

简介:Apache Pulsar 2.9.1 的官方二进制发行包(bin.tar.gz),面向需要在分布式环境中搭建消息中间件的后端开发、数据平台与运维人员,用于应对高吞吐实时消息传递、集群容错与云原生部署等场景,适合已具备一…

2026/11/2 23:39:38

2026-10-30|宠物店洗护预约总撞单?排班要过完的 5 道坎

title: 2026-10-28|宠物店洗护预约总撞单?排班要过完的 5 道坎 宠物店洗护预约总撞单?排班要过完的 5 道坎 宠物洗护撞单,根子不在前台记性差,而在三处结构缺陷:预约入口分散导致同一张表被四个人改、服务时…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑