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

hot100 124.二叉树中的最大路径和

1.思路:本题和543.二叉树的直径类似。

(1)链:从下面的某个节点(不一定是叶子节点)到当前节点的路径,这条链的节点值之和即为dfs的返回值。如果节点值之和是负数,则返回0(因为要和0取最大值)。

(2)直径:等价于由两条(或者一条)链拼成的路径。我们枚举每个node,假设直径在这里“拐弯”,也就是计算由左右两条从下面的某个节点(不一定是叶子节点)到node的链的节点值之和,然后去更新答案的最大值。

2.注意:dfs返回的是链的节点值之和,不是直径的节点值之和。

3.疑问:如果节点值都是负数,会得出什么结果?

答:如果所有节点值都是负数,那么就是要求最大节点值(即绝对值最小的负数)。因为在所有节点值都为负数的情况下,路径中只有一个最大节点值(即绝对值最小的负数)是最优的,毕竟随着节点数量的增多,路径和只会减小,此时求出来的最大路径和就是max(nums)。

递归三部曲:

1.确定递归函数的参数和返回值类型:

(1)参数:根节点root。

(2)返回值类型:返回最大路径和,为int类型。

(3)全局变量:ans,记录最大路径和。

private int ans = Integer.MIN_VALUE; public int maxPathSum(TreeNode root)

2.确定终止条件:如果节点为空,则返回0。不存在节点的话最大路径自然是0。

if(node == null){ return 0; }

3.确定单层递归的逻辑:因为求最大路径和要先知道左子树和右子树的链长,因此采用后序遍历的顺序,先递归左右子树,再求最大路径和。

int left = dfs(node.left); int right = dfs(node.right); // 计算全局答案,计算以当前节点为根的最大路径和,因此可以返回两条链 ans = Math.max(ans,left + right + node.val); // 是递归过程,只需返回从左子树或右子树到当前节点的最大路径链给上层,是告诉父节点,从我这个节点往下走,能得到的最大链和是多少 return Math.max(Math.max(left,right) + node.val,0);

复杂度分析:

(1)时间复杂度:O(n),其中n为二叉树的节点个数。

(2)空间复杂度:O(n),最坏情况下,二叉树会退化成一条链,递归需要O(n)的栈空间。

附代码:

class Solution { private int ans = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { dfs(root); return ans; } private int dfs(TreeNode node){ if(node == null){ return 0; } int left = dfs(node.left); int right = dfs(node.right); // 计算全局答案,计算以当前节点为根的最大路径和,因此可以返回两条链 ans = Math.max(ans,left + right + node.val); // 是递归过程,只需返回从左子树或右子树到当前节点的最大路径链给上层,是告诉父节点,从我这个节点往下走,能得到的最大链和是多少 return Math.max(Math.max(left,right) + node.val,0); } }
http://www.jsqmd.com/news/310153/

相关文章:

  • 基于python的大气质量分析与预测项目(大数据分析数据可视化机器学习)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • Python全球酒店预订数据分析课程(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 基于Python的网络数据分析可视化(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 未来3年,云端IDE市场格局将被DevBox类产品彻底颠覆
  • 十大门窗品牌哪家好?2026年真实测评排行榜与选购指南
  • mapCIDR使用手册
  • 吴恩达深度学习课程五:自然语言处理 第二周:词嵌入 课后习题与代码实践
  • 微信小程序监听返回操作,强制停留当前页面(右滑手势、安卓物理返回键)
  • JVM定义
  • 大语言模型实战(十七)——GraphRAG(图谱检索增强生成)介绍
  • Java毕设选题推荐:基于springboot的小区公共收益管理系统小区电梯广告、公共车位、场地租赁【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 计算机Java毕设实战-基于springboot的小区公共收益管理系统小区公共配套设施收益管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java计算机毕设之基于springboot的小区公共收益归属、分配、管理、使用管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 使用Qwen-agent构建智能体解决大模型数学计算问题
  • 使用VLLM+Deepseek+Milvus构建本地向量库
  • wqs二分
  • 【路径规划】基于快速扩展随机树RRT规划器实现机器人在在网格内找到从指定起始区域到目标区域的路径,同时避开沿途障碍物附matlab代码
  • 【图像增强】水下图像一致性增强评价系统Matlab实现
  • 【免费代码分享】10种卷积神经网络融合BiLSTM的多变量时间序列预测
  • 时序数据库 Apache IoTDB 入选国家重点研发计划高新技术成果产业化试点
  • 2026年回望:Sealos DevBox如何重新定义了云端开发的标准
  • Mac启动Redis并连接
  • 渲染慢到通宵,如何提高渲染速度? 这套技巧3 步搞定!
  • GPU 和 CPU 渲染谁更顶?新手必看的选型指南
  • 如何高效查询海量IP归属地?大数据分析中的IP查询应用
  • Github开源插件!最新豆包AI无水印图批量下载,免费无广告使用,支持高清无损图片下载 (1)
  • 私藏视频不想被看到?1招伪装教你一秒钟伪装
  • 《P2151 [SDOI2009] HH 去散步》
  • 基于Springboot学生交流培养管理平台【附源码+文档】
  • 基于Springboot流浪动物救助平台【附源码+文档】