news 2026/6/10 17:27:20

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:24:58

【课程设计/毕业设计】基于springboot社交网络平台 基于SpringBoot的校园生活互动平台【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 14:15:49

虚拟人即界面——XmovAvatar SDK 在具身辩论系统中的设计与封装实践

目录前言1 引言:为什么要引入 3D 虚拟人1.1 文本与语音交互的能力边界1.2 具身表达对训练沉浸感的提升2 XmovAvatar SDK 能力概览2.1 实时 3D 渲染能力2.2 语音驱动动画能力2.3 状态与事件回调机制3 AvatarService 的设计思路3.1 为什么要进行 SDK 二次封装3.2 连接…

作者头像 李华
网站建设 2026/6/10 13:08:01

数据湖学习路线总结

数据湖学习指南:从入门到进阶的系统方法与资源推荐 一、明确学习目标与路径​ 数据湖(Data Lake)是存储海量原始数据(结构化/半结构化/非结构化)的集中式存储库,支持后续的数据分析、机器学习等场景。学习需遵循“概念→技术→实践→进阶”的路径,重点掌握架构设计、核心…

作者头像 李华
网站建设 2026/6/8 17:19:18

计算机Java毕设实战-基于springboot的大学生社交平台基于springboot+web的大学生一体化服务平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 12:38:24

使用Qwen-agent构建智能体解决大模型数学计算问题

场景: 在某些场景中,需要大模型准确计算数学公式, 而语言模型天生不适合进行复杂的逻辑计算。因此把计算封装成函数。 使用agent解决逻辑计算问题. 第一步: 起模型服务 可以本地起服务 llm_cfg {# Use your own model service compatible with OpenAI…

作者头像 李华