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

050二叉树中的最大路径和

二叉树中的最大路径和

题目链接:https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/?envType=study-plan-v2&envId=top-100-liked

我的解答:

public int ans = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { dfs(root); return ans; } public int dfs(TreeNode cur){ if(cur == null){ return Integer.MIN_VALUE; } int leftMax = dfs(cur.left); int rightMax = dfs(cur.right); int maxNotCur = Math.max(leftMax, rightMax);//不包含当前节点时的路径最大值 ans = Math.max(ans, maxNotCur); int max;//包含当前节点时的路径最大值 if(leftMax == Integer.MIN_VALUE && rightMax == Integer.MIN_VALUE){//当前节点为叶子节点 max = cur.val; } else if(leftMax == Integer.MIN_VALUE || rightMax == Integer.MIN_VALUE){//当前节点的左孩子或右孩子为空 max = cur.val + maxNotCur; } else{ max = cur.val + Math.max(maxNotCur, leftMax + rightMax);//当前节点的左孩子和右孩子都不为空 } max = Math.max(max, cur.val); ans = Math.max(ans, max); return maxNotCur > 0 ? cur.val + maxNotCur : cur.val; }

分析:代码的时间复杂度为O(n),空间复杂度为O(n)。解题思路:遍历二叉树,每次递归获取当前节点左子树的最大路径和(一定包含当前节点的左孩子)与右子树的最大路径和(一定包含当前节点的右孩子),每次遍历用全局变量ans记录答案,对于每个节点,需要进行两种情况的答案比较,第一种情况是不包含当前节点,另一种情况是包含当前节点。

​ 情况一(不包含当前节点):取当前节点左、右子树的最大路径和较大的那个值与答案作比较即可;

​ 情况二(包含当前节点):对于这种情况,我们需要注意溢出问题(当前节点的左孩子或右孩子为空时,值相加会导致溢出),所以需要按左、右孩子是否为空分三种情况讨论。将三种不同情况得出的最大值与当前节点的值作比较取最大值并与答案作比较即可。

​ 注意递归方法最后返回的当前节点的最大路径和一定是包含当前节点的情况,且不能是既包含左孩子又包含右孩子的情况。

看了官方题解后的解答:

public int ans = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxGain(root); return ans; } public int maxGain(TreeNode cur){ if(cur == null){ return 0; } //只有在最大贡献值大于 0 时,才会选取对应子节点 int leftGain = Math.max(maxGain(cur.left), 0);//左孩子的最大贡献值 int rightGain = Math.max(maxGain(cur.right), 0);//右孩子的最大贡献值 int curGain = cur.val + leftGain + rightGain;//节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值 ans = Math.max(ans, curGain); //返回节点的最大贡献值 return cur.val + Math.max(leftGain, rightGain); }

分析:

​ 1、代码的时间复杂度为O(n),空间复杂度为O(n)。

​ 2、解题思路:对于每一个节点而言,节点的最大路径和取决于该节点的值与该节点的左、右子节点的最大贡献值,且只有在最大贡献值大于0时,才会选取对应子节点。

​ 3、我的解答与官方解答的区别:主要区别在于对当前节点的左、右子节点的最大贡献值小于0时的处理方法。我用了分情况讨论,所以编码较为复杂;而官方题解直接将贡献度小于0的赋值为0,贡献度为0意味着不选取这个子节点,直接避开了不同情况的讨论和溢出问题,编码简单,思路清晰易懂。

总结

  • 本题的关键在于总结出“节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值”这个结论,以及节点的贡献值为负数时如何处理。
http://www.jsqmd.com/news/839315/

相关文章:

  • 为Grok等大模型构建高效网页内容抓取与结构化提取工具
  • 重庆川岳机电设备:高新区性价比高的吊装搬运怎么联系 - LYL仔仔
  • PyInstaller Extractor终极指南:5分钟学会提取可执行文件源码
  • 从零构建私有数字保险库:硬件选型、加密策略与实战部署
  • FPGA深度学习加速器设计与能效优化实践
  • 紧急通知:2024秋季学期起,牛津/北大文学系已将NotebookLM列为必修研究工具——你还在手动做人物关系表?
  • 为什么永辉超市卡常被闲置?3个关键原因分析及回收技巧 - 团团收购物卡回收
  • 从SIFT到SURF:为什么‘加速’和‘稳健’对移动端图像识别App如此重要?
  • 虚幻引擎自定义网络协议开发指南:从原理到实践
  • 昆山打官司胜诉率高的律师服务选择要点分析 - 品牌排行榜
  • 5分钟搞定!Postman便携版:你的API测试随身工具箱 [特殊字符]
  • 【终端窗口掌控术】Linux resize命令:从基础调整到自动化脚本的进阶指南
  • 3个核心技巧:用League Akari成为英雄联盟高效玩家
  • 3步掌握ffmpeg-static:从零部署到生产环境完全指南
  • 终极指南:如何快速在Windows上安装Android应用?告别模拟器的完整解决方案
  • 通过Taotoken用量看板分析CRM网站AI功能的使用峰值与规律
  • 3分钟学会Win11Debloat:彻底清理Windows预装应用和隐私设置
  • 别再手动标引了!NotebookLM自动主题抽取在古籍整理中的5大突破性验证
  • 如何高效使用WinRing0:Windows硬件访问的完整实战指南
  • 企业级应用如何通过Taotoken实现API密钥管理与访问审计
  • 2026年贵阳保安加盟、物业托管一站式安保服务商深度对比指南 - 精选优质企业推荐官
  • 命令行AI工具gemini-cli:无缝集成Gemini大模型提升终端效率
  • 告别传统引导|从Legacy到UEFI的平滑迁移实战
  • 基于MCP协议构建本地AI记忆系统:私有化部署与实战指南
  • 闲置大润发卡的正确使用方法,教你快速回收! - 团团收购物卡回收
  • 终极AMD处理器调试指南:5分钟掌握Ryzen SDT工具解锁隐藏性能
  • Linux变更冻结执行排查方法
  • 嵌入式安全纵深防御:从MCU硬件到通信协议的全链路实战指南
  • 2026 海口劳力士手表回收地图:实测 5 家靠谱商家地址汇总 - 奢侈品回收测评
  • 3步搭建PUBG战术雷达:免费开源实现战场信息可视化的完整指南