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

050二叉树中的最大路径和

二叉树中的最大路径和题目链接https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/?envTypestudy-plan-v2envIdtop-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.zskr.cn/news/1310026.html

相关文章:

  • 使用Taotoken CLI工具一键配置开发环境,统一团队AI服务接入标准
  • Python3数字类型完全指南:从基础到高级应用
  • 纯文本表格终极指南:如何在代码注释和技术文档中优雅展示数据
  • 命令行AI工具gemini-cli:无缝集成Gemini大模型提升终端效率
  • LightningRAG:全栈优化实现检索增强生成效率革命
  • ARM1176JZF-S处理器架构与嵌入式开发实战
  • Awesome Digital Human:基于Live2D与AI编排框架的开源数字人技术方案
  • 内容创作团队借助多模型聚合能力提升文案生成多样性
  • 魔兽争霸3运行卡顿?试试这款兼容性修复神器,让经典游戏在现代电脑上流畅运行
  • Layerdivider:3分钟让单张插画变可编辑PSD,设计师的智能分层助手
  • SQL Server 2005部署备份任务
  • 3步掌握ffmpeg-static:从零部署到生产环境完全指南
  • Postman便携版:5分钟搭建Windows绿色免安装API测试环境
  • 2026 年上海黄金回收指南:五大正规门店实测,避坑不踩雷 - 速递信息
  • 2位相位可重构天线设计与波束控制技术解析
  • 对比直接使用官方API体验Taotoken在计费模式上的灵活性
  • 告别传统引导|从Legacy到UEFI的平滑迁移实战
  • 观察Taotoken在流量高峰时段的容灾与自动路由能力实际表现
  • 2026 年 5 月福州大牌首饰回收门店推荐:实地探访 5 家正规机构排名 - 奢侈品回收测评
  • 从印加奇普到软件测试:跨越千年的密码破解逻辑
  • 大模型推理优化:延迟与吞吐量的工程实践
  • BlenderProc避坑全记录:从‘pip install’失败到成功渲染第一张图的完整流程(Ubuntu 20.04/22.04)
  • GIT 切换分支合并分支前一定要先 fetch,一定要选择远程分支进行操作
  • 【技术解析】VadCLIP:如何让视觉语言模型“看懂”视频异常?
  • 如何在3分钟内掌握Illustrator智能填充脚本的核心工作流
  • 飞凌嵌入式RV1126B核心板:轻量级AI视觉边缘计算实战指南
  • 联想拯救者工具箱:开源替代方案实现笔记本性能优化与硬件控制
  • 从RStudio到VSCode:vscode-R插件架构演进与工作流重构指南
  • 2026年贵阳保安加盟与一站式物业保洁服务商选择指南:正规资质、专业团队、本地化响应 - 精选优质企业推荐官
  • GEO优化系统哪家好:帮你避开选型误区 - FaiscoJeff