LeetCodehot 力扣热题100
class Solution {
public:int max_sum = INT_MIN; // 初始化为最小值,确保能够处理所有可能的路径和int maxPathSum(TreeNode* root) {dfs(root);return max_sum;}int dfs(TreeNode* root) {if (root == nullptr) return 0; // 如果是空节点,返回0// 递归计算左子树和右子树的最大路径和,负值则不贡献路径和int left = max(0, dfs(root->left)); // 只考虑正路径int right = max(0, dfs(root->right)); // 只考虑正路径// 计算当前节点的最大路径和,包括根节点与左、右子树的路径max_sum = max(max_sum, root->val + left + right);// 返回当前节点的最大贡献值return root->val + max(left, right); // 返回当前节点的最大路径和(要么包括左子树,要么右子树)}
};
路径上的节点最多有两个相邻节点。
好的,接下来我会详细解析你之前提到的 二叉树最大路径和 代码的思路。
问题说明
最大路径和问题的目标是:在一个二叉树中找到一条路径,使得路径上的节点值的和最大。这条路径可以通过任意节点,不需要从根节点开始,并且路径可以穿越树的多个分支。
• max_sum 作为一个全局变量,用来存储二叉树中计算出来的最大路径和。初始化为 0,代表我们初始时尚未计算任何路径的和。
2. maxPathSum 函数
int maxPathSum(TreeNode* root) {
dfs(root); // 从根节点开始,递归计算最大路径和
return max_sum; // 返回最大路径和
}
• maxPathSum 是主要的接口函数,它接收二叉树的根节点 root 作为输入,调用 dfs 函数计算路径和。
• 调用 dfs(root) 会触发对整个树的深度优先搜索。
• 最后返回 max_sum,这个变量会保存二叉树中遍历得到的最大路径和。
3. 深度优先搜索 dfs 函数
int dfs(TreeNode* root) {
if (root == nullptr) return 0; // 递归边界:如果节点为空,路径和为0
• dfs 是一个递归函数,负责从当前节点计算出其左右子树的路径和,并更新 max_sum。
• 如果当前节点是 nullptr(即为空节点),直接返回 0,因为空节点对路径和没有任何贡献。
int left = max(0, dfs(root->left)); // 计算左子树的最大路径和,若为负数则不贡献,返回0
int right = max(0, dfs(root->right)); // 计算右子树的最大路径和,若为负数则不贡献,返回0
• 计算当前节点的左子树和右子树的最大路径和。
• 对于每个子树,我们希望只考虑正路径和(即如果某个子树的路径和是负数,那么我们就不考虑这条路径)。因此,使用 max(0, dfs(...)) 来确保如果子树的路径和为负数,则返回 0,表示我们不选取该子树。
• dfs(root->left) 和 dfs(root->right) 分别递归地计算左子树和右子树的最大路径和。
max_sum = max(max_sum, root->val + left + right); // 以当前节点为根的路径和
• 现在我们计算的是通过当前节点 root 的路径和,这个路径包括:
• 当前节点的值 root->val
• 左子树的最大路径和 left
• 右子树的最大路径和 right
• max_sum 会更新为当前路径和和之前的最大路径和中的较大值。
return root->val + max(left, right); // 返回当前节点的最大路径和
• 由于路径不能跨越多个分支,因此我们只能选择单边(左子树或右子树)继续延伸路径。返回当前节点的最大路径和时,我们只选择左子树和右子树中的较大者:
• root->val + max(left, right) 表示包括当前节点和其较大子树路径和的最大路径和。
4. 递归的执行流程
• 从根节点开始递归。
• 对于每个节点:
• 计算左右子树的最大路径和(递归调用 dfs)。
• 更新全局变量 max_sum。
• 返回当前节点的最大路径贡献(选择左子树或右子树的较大路径)。
• 最终 max_sum 就包含了整棵树的最大路径和。
代码执行流程(示例)
假设有以下二叉树:
1
/ \
2 3
/ \
4 5
1. 调用 maxPathSum(root),根节点是 1:
• 进入 dfs(1)。
2. dfs(1):
• 左子树是 2,右子树是 3,开始计算左右子树的路径和。
3. 计算 dfs(2)(左子树):
• 左子树是 4,右子树是 5,继续递归。
4. 计算 dfs(4):
• 节点 4 没有子树,返回 4。
5. 计算 dfs(5):
• 节点 5 没有子树,返回 5。
6. 计算 dfs(2):
• left = 4,right = 5,节点 2 的路径和是 2 + 4 + 5 = 11。
• 更新 max_sum = 11。
• 返回 2 + max(4, 5) = 7。
7. 计算 dfs(3)(右子树):
• 节点 3 没有子树,返回 3。
8. 计算 dfs(1)(根节点):
• left = 7,right = 3,节点 1 的路径和是 1 + 7 + 3 = 11,max_sum 不变。
• 返回 1 + max(7, 3) = 8。
9. 最终结果:
• max_sum = 11,即树中的最大路径和是 4 -> 2 -> 5 或 4 -> 2 -> 1 -> 3。
总结
1. 深度优先搜索:通过递归遍历树中的每个节点,计算以每个节点为根的最大路径和。
2. 路径和的更新:对于每个节点,计算包括其左右子树的路径和,并更新全局最大路径和 max_sum。
3. 递归的返回值:每个节点返回的路径和代表它向上回溯的贡献,它是当前节点值与左、右子树最大路径和中的较大者之和。
这种方法的时间复杂度是 O(n),其中 n 是二叉树的节点数,因为每个节点只会被访问一次。
相关文章:
LeetCodehot 力扣热题100
class Solution { public:int max_sum INT_MIN; // 初始化为最小值,确保能够处理所有可能的路径和int maxPathSum(TreeNode* root) {dfs(root);return max_sum;}int dfs(TreeNode* root) {if (root nullptr) return 0; // 如果是空节点,返回0// 递归…...
解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025
2025 年 3 月 11-13 日,全球规模最大的嵌入式展览会——Embedded World 2025 将在德国纽伦堡盛大开幕。作为物联网和嵌入式技术领域的领先企业,乐鑫信息科技 (688018.SH) 将展示在 AI LLM、HMI、双频 Wi-Fi 6、低功耗 MCU 和 Matter 等领域的最新技术及解…...
C# 背景 透明 抗锯齿 (效果完美)
主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...
Debezium:实时数据捕获与同步的利器
一、什么是 Debezium Debezium 是一个开源的分布式平台,专门用于捕获数据库中的数据变更。它通过读取数据库的事务日志,能够以非侵入性的方式捕获数据库中发生的所有变化,并将这些变化转化为事件流,实时推送到像 Kafka 这样的消息…...
Word中接入大模型教程
前言 为什么要在word中接入大模型呢? 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事,拆分一下就是: 获取用户…...
Centos修改ip
1 查看ip [rootlocalhost ~]# ip addr2 root账号修改ip [rootlocalhost ~]# su [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ [rootlocalhost network-scripts]# llvi编辑ifcfg-ens33 3 重启网卡 [rootlocalhost network-scripts]# systemctl restart network...
uni-app小程序开发 基础知识2
目标: 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码: <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…...
第4章 4.1 Entity Framework Core概述
4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象,而“关系”是关系型数据库,“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM ,可以通过创建C#对象的方式把数据插入数据库而不需…...
在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解
文章目录 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定义 Student 类2. 配置类:初始化 Bean3. 测试类:使用 Autowired 注解自动注入 Bean4. Spring Boot 的自动装配5. 总结 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…...
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好? 随着大语言模型(LLM)在实际应用中的普及,许多开发者开始寻求能够帮助他们更高效地开发基于语言模型的应用框架。在众多框架中,La…...
Java 中的内存泄漏问题及解决方案
在 Java 中,内存泄漏(Memory Leak)是指在程序运行过程中,某些对象已经不再使用,但由于引用仍然存在,这些对象无法被垃圾回收器回收,从而导致内存无法释放,最终可能导致系统性能下降甚…...
VS Code 如何搭建C/C++开发环境
目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…...
【Linux C/C++开发】Linux系统轻量级的队列缓存mqueue
前言 开发设计时,通常会对业务流程进行模块化,有些流程之间,不要求同步,但又需要传递信息时,如果存储到数据库,效率降低很多,如果是存放在内存是最好的。此时可以选择系统的IPC(进程…...
排查生产sql查询缓慢
生产投产检验,发现查询客户明细的接口数据响应需要5秒以上,通过接口可以查询到详细的后端代码 1. 先排查后端的代码实现,并未出现复杂逻辑,那么就应该是sql的问题 2. 通过explain对sql进行解析,发现sql没有走索引 3.…...
idea从远程gitee拉取项目
文章目录 从gitee上面拿到项目地址填写远程地址,并且设置项目保存位置拉取成功 从gitee上面拿到项目地址 填写远程地址,并且设置项目保存位置 拉取成功...
【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记
本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码,当执行 addLast() 与 getLast() 方法时需要遍历链表,效率不高,因此可以添加一个指向链表末尾的索引&am…...
软件测试与软件开发之间的关系
软件测试与软件开发的关系 软件测试(Software Testing)与软件开发(Software Development)是软件工程中的两个核心环节,它们相辅相成,确保软件的质量和功能满足需求。以下是两者之间的关系解析:…...
QT 建立一片区域某种颜色
绘制一个位于(50, 50)的200x200的红色矩形 #include "widget.h" #include "ui_widget.h" #include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);update(); }Widget::~Widget() {delete…...
LeetCode--23. 合并 K 个升序链表【堆和分治】
23. 合并 K 个升序链表 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 正文 这道题有多种解决方案 堆 比较容易,又比较直观的就是堆排序,将每个节点加入最小根堆中&…...
tp6上传文件大小超过了最大值+验证文件上传大小和格式函数
问题: 最近用tp6的文件上传方法上传文件时报文件过大错误。如下所示: $file $this->request->file(file);{"code": 1,"msg": "上传文件大小超过了最大值!","data": {"code": 1,&q…...
3步终极优化:用Win11Debloat免费让Windows 11运行速度提升90%
3步终极优化:用Win11Debloat免费让Windows 11运行速度提升90% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter…...
Method Draw:免费开源的轻量级SVG编辑器完整指南
Method Draw:免费开源的轻量级SVG编辑器完整指南 【免费下载链接】Method-Draw Method Draw, the SVG Editor for Method of Action 项目地址: https://gitcode.com/gh_mirrors/me/Method-Draw 你是否曾经需要快速创建简单的矢量图形,却被复杂的专…...
FanControl深度指南:3步打造电脑风扇的智能交响乐团
FanControl深度指南:3步打造电脑风扇的智能交响乐团 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...
Synology HDD db:如何完全解锁群晖NAS硬盘兼容性限制的终极指南
Synology HDD db:如何完全解锁群晖NAS硬盘兼容性限制的终极指南 【免费下载链接】Synology_HDD_db Add your HDD, SSD and NVMe drives to your Synologys compatible drive database and a lot more 项目地址: https://gitcode.com/GitHub_Trending/sy/Synology_…...
别再用Python列表了!用NumPy的ndarray处理数据,效率提升10倍不是梦
别再用Python列表了!用NumPy的ndarray处理数据,效率提升10倍不是梦 第一次用Python处理十万行销售数据时,我的笔记本风扇狂转了15分钟后蓝屏了。这让我意识到,当数据量超过玩具级别时,原生列表(list)就像用勺子挖隧道—…...
别再只会用轮询了!STM32CubeMX串口中断接收实战:从HAL_UART_Receive_IT到回调函数详解
STM32CubeMX串口中断实战:从轮询到中断的思维跃迁 当传感器数据以毫秒级频率涌入,或上位机指令需要即时响应时,轮询方式就像用显微镜观察流星雨——既低效又容易丢失关键信息。本文将揭示如何通过STM32CubeMX构建真正的异步通信框架ÿ…...
AI代理循环Ralph:自动化代码生成与质量检查的工程实践
1. 项目概述:一个能“自己写代码”的AI代理循环如果你和我一样,对AI辅助编程工具(比如Amp或者Claude Code)又爱又恨,爱的是它们能快速生成代码片段,恨的是它们经常“健忘”,上下文一长就逻辑混乱…...
XUnity.AutoTranslator终极指南:Unity游戏实时翻译解决方案完全解析
XUnity.AutoTranslator终极指南:Unity游戏实时翻译解决方案完全解析 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而无法畅玩心仪的外语游戏?XUnity.Auto…...
Ripple:基于复杂自适应系统与星海合议架构的高效多智能体模拟引擎
1. 项目概述:从“一人一Agent”到“群体涌现”的范式跃迁如果你和我一样,在过去几年里尝试用大语言模型(LLM)来模拟人类社会的复杂行为,比如预测一条小红书笔记的传播效果,或者评估一个新产品在目标市场的接…...
DDrawCompat终极指南:让Windows 11上的经典老游戏重获新生
DDrawCompat终极指南:让Windows 11上的经典老游戏重获新生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DD…...
