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

day168—递归—二叉树的最大路径和(LeetCode-124)

题目描述

二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。

路径和是路径中各节点值的总和。

给你一个二叉树的根节点root,返回其最大路径和

示例 1:

输入:root = [1,2,3]输出:6解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:

输入:root = [-10,9,20,null,null,15,7]输出:42解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

  • 树中节点数目范围是[1, 3 * 104]
  • -1000 <= Node.val <= 1000

解决方案:

这段代码是基于后序遍历(DFS)求解二叉树最大路径和的经典最优实现,核心思路是通过递归同时完成两个关键任务:计算节点向下延伸的有效路径和、统计以每个节点为 “拐点” 的完整路径和,最终找到整棵树的最大路径和。

核心逻辑

  1. 核心定义

    • ans:全局变量(初始化为极小值-0xFFFF),用于记录遍历过程中找到的最大路径和,覆盖所有可能的路径场景;
    • dfs(node):递归函数,核心作用有两个:① 返回node为起点,向下延伸(仅能选左 / 右子树其一)的有效路径和(有效指路径和非负,负路径无贡献);② 递归过程中计算以node为 “拐点” 的完整路径和,并更新全局最大值ans
  2. 递归边界:若node为空(!node),返回 0—— 空节点对路径和无任何贡献,直接返回 0。

  3. 后序遍历核心逻辑

    • 先递归计算左子树的向下有效路径和l_val = dfs(node->left)
    • 再递归计算右子树的向下有效路径和r_val = dfs(node->right)
    • 关键更新:以当前节点为 “拐点” 的完整路径和 =l_val + r_val + node->val(左子树延伸路径 + 右子树延伸路径 + 当前节点值),用该值更新ans(确保不遗漏所有可能的路径);
    • 结果返回:max(0, max(l_val, r_val) + node->val)—— 仅返回向下延伸的最优路径和,且通过max(0, ...)过滤负贡献(若路径和为负,说明该路径无价值,直接返回 0 放弃)。
  4. 主函数逻辑:调用dfs(root)触发整棵树的后序遍历,遍历完成后ans即为整棵树的最大路径和,直接返回即可。

关键特点

  • 时间效率 O (n):每个节点仅被递归访问一次,无重复计算,是二叉树遍历的最优时间复杂度;
  • 空间效率 O (h):递归栈深度等于树的高度h(平衡树h=logn,链表状树h=n),无额外空间开销;
  • 逻辑精准
    • 用 “拐点路径和” 覆盖所有可能的路径形态(如左子树→当前节点→右子树、单节点、单侧子树延伸等);
    • max(0, ...)过滤负贡献路径,避免无效路径拉低整体和(例如节点值全为负时,会选择值最大的单个节点);
  • 边界适配:初始值-0xFFFF能覆盖 “所有节点值为负” 的极端场景,确保不会遗漏有效路径。

总结

  1. 核心思路:后序遍历中,将 “向下延伸的路径和”(供父节点使用)与 “拐点完整路径和”(更新全局最大值)拆分处理,兼顾递归传递性和结果完整性;
  2. 关键设计:max(0, ...)过滤负贡献、“拐点路径和更新 ans” 是解决该问题的两大核心;
  3. 功能效果:能正确处理所有场景(含全负节点、单节点、平衡树 / 链表树等),是该问题的工程级最优解法。

函数源码:

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: int ans=-0xFFFF; int dfs(TreeNode* node){ if(!node) return 0; int l_val=dfs(node->left); int r_val=dfs(node->right); ans=max(ans,l_val+r_val+node->val); return max(0,max(l_val,r_val)+node->val); } int maxPathSum(TreeNode* root) { dfs(root); return ans; } };
http://www.jsqmd.com/news/295050/

相关文章:

  • 为macOS Finder提供直观的剪切粘贴体验
  • OpenAI深度报告:大模型王者,引领AGI之路|附26页PDF文件下载
  • Java毕设选题推荐:基于springboot的自行车分享平台基于JAVA的自行车分享平台 骑行装备分享系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 怎么实现一个多模态RAG系统?非常详细收藏我这一篇就够了
  • 2026年AI Agent智能体技术发展报告|附85页PDF文件下载
  • 计算机Java毕设实战-基于springboot的智能药箱系统服药时间提醒【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 洛谷 P1650 田忌赛马 题解
  • 计算机Java毕设实战-基于springboot的自行车分享平台共享单车、租聘信息、归还结算【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026.1.24 作业 - # P1441 砝码称重
  • Java毕设项目:基于springboot的智能药箱系统(源码+文档,讲解、调试运行,定制等)
  • Java毕设项目:基于springboot的自行车分享平台(源码+文档,讲解、调试运行,定制等)
  • 【课程设计/毕业设计】基于JAVA的自行车分享平台 骑行装备分享系统基于springboot的自行车分享平台【附源码、数据库、万字文档】
  • Java计算机毕设之基于Spring Boot的自行车共享租赁平台开发 Spring Boot驱动的智能共享单车租基于springboot的自行车分享平台(完整前后端代码+说明文档+LW,调试定制等)
  • 【毕业设计】基于springboot的自行车分享平台(源码+文档+远程调试,全bao定制等)
  • 2026.1.24 - # P1441 砝码称重
  • CF946G Almost Increasing Array 题解
  • 2026.1.24 作业 - # P13521 [KOI 2025 #2] 包
  • 国产PCB阻抗测试分析仪:Bamtone班通怎么样?
  • 降AIGC率网站排名榜单:10大热门平台及免费付费功能对比
  • 【毕业设计】基于springboot的智能药箱系统(源码+文档+远程调试,全bao定制等)
  • YOLO26改进 - SPPF模块 | AIFI基于注意力的尺度内特征交互:替代SPPF构建高效混合编码器,提升模型综合效能
  • 2026.1.24 作业 - # P1362 兔子数
  • YOLO26改进 - SPPF模块 | 替代SPPF,FFocal Modulation焦点调制:即插即用轻量设计优化全局语义捕获
  • 大模型微调技术详解:从LoRA到P-Tuning v2,一文掌握高效微调方法
  • 用通俗的方式介绍大语言模型训练过程,非常详细收藏我这一篇就够了
  • 程序员收藏!AI产品经理转型与大模型学习全攻略,抢占AI时代先机,传统PM如何快速转型成AI产品经理?
  • 大模型训练全攻略:从监督学习到数据预处理的完整指南
  • 字节序及IP地址转换
  • LeetCode 134. 加油站(O(n)时间+O(1)空间最优解)
  • 【计算机毕业设计案例】基于Springboot的幼儿园综合管理系统基于springboot的幼儿园管理系统基于SpringBoot+Vue的幼儿园管理系统(程序+文档+讲解+定制)