首页/新闻资讯/正文详情

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

发布时间:2026/11/2 22:49:10 来源:云帆数科 栏目:资讯中心
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思路通过后序遍历在递归过程中维护和更新全局状态。掌握这个模式可以解决一大类二叉树路径问题。

相关推荐

Wireshark抓包过滤命令实战:捕获过滤器与显示过滤器排障指南
Wireshark抓包过滤命令实战:捕获过滤器与显示过滤器排障指南

排查网络问题排查到后半夜的人大概都有过这种体验:日志里看不出所以然,服务端说没收到请求,客户端说超时了,中间隔着一堆设备和一层层转发,谁也说不清那一瞬间链路上到底跑了什么。这时候能救命的只有一个动作——在正… · 2026/11/2 22:48:09

DeepSeek Harness桌面端:Electron+Node+Python三进程AI工作流引擎
DeepSeek Harness桌面端:Electron+Node+Python三进程AI工作流引擎

1. 项目概述:这不是“又一个GPT桌面端”,而是工作流引擎的本地化突围最近刷到“DeepSeek Harness 出了桌面端?”这个标题,我第一反应不是点开,而是抓起键盘连上远程终端——因为过去三年里,我亲手搭过27个A… · 2026/11/2 22:48:09

DeepSeek Harness与Pi Agent的本质差异解析
DeepSeek Harness与Pi Agent的本质差异解析

1. “Harness”这个词,正在被不同团队悄悄重定义最近在几个技术社区里反复看到一句话:“同样叫 Harness,DeepSeek Harness 和 Pi 根本不在同一层。”起初我以为是营销话术,直到我亲手把 DeepSeek Harness v0.1.5 的源码 clone 下来… · 2026/11/2 22:48:09

4步装出macOS虚拟机:从官方镜像到可启动macOS虚拟机ISO的完整流程
4步装出macOS虚拟机:从官方镜像到可启动macOS虚拟机ISO的完整流程

4步装出macOS虚拟机:从官方镜像到可启动macOS虚拟机ISO的完整流程 【免费下载链接】macos-virtualbox Push-button installer of macOS Catalina, Mojave, and High Sierra guests in Virtualbox on x86 CPUs for Windows, Linux, and macOS 项目地址: https://gi… · 2026/11/3 10:12:22

AiSOC Syslog 监听器实战:用 UDP/TCP 直收 RFC 5424、RFC 3164、CEF 与 LEEF
AiSOC Syslog 监听器实战:用 UDP/TCP 直收 RFC 5424、RFC 3164、CEF 与 LEEF

人工智能AI Agent网络安全后端前端 【免费下载链接】AiSOC Open-source AI Security Operations Center: alert fusion, LLM-agent triage, MITRE ATT&CK investigation, and a replayable decision ledger for every agent step. Self-hostable, runs with no API keys, M… · 2026/11/3 10:12:22

一键安装fcitx5皮肤:fcitx5-themes-candlelight最简单install.sh安装教程
一键安装fcitx5皮肤:fcitx5-themes-candlelight最简单install.sh安装教程

【免费下载链接】fcitx5-themes-candlelight fcitx5的简约风格皮肤——烛光。 项目地址: https://gitcode.com/gh_mirrors/fc/fcitx5-themes-candlelight 点击查看 免费下载 fcitx5-themes-candlelight(烛光)是专为 fcitx5 输入法打造的一套… · 2026/11/3 10:12:22

Android教学项目立项完成
Android教学项目立项完成

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

Anthropic 发布《AI-Native SDLC Playbook》:当代码不再是瓶颈,开发规范应该管什么
Anthropic 发布《AI-Native SDLC Playbook》:当代码不再是瓶颈,开发规范应该管什么

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

Spook算法的各种密码分析方法全面盘点
Spook算法的各种密码分析方法全面盘点

Spook算法的各种密码分析方法全面盘点对Spook算法的密码分析,目前公开的研究主要集中在其核心组件Shadow置换上,特别是针对NIST轻量级密码竞赛第二轮的候选版本。以下是目前已发现的各类密码分析方法盘点:🔬 针对核心置换 Shadow … · 2026/11/3 10:11:21

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* 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 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现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/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的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/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* 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 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码