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

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

目标&#xff1a; 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码&#xff1a; <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#中的对象&#xff0c;而“关系”是关系型数据库&#xff0c;“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM &#xff0c;可以通过创建C#对象的方式把数据插入数据库而不需…...

在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解

文章目录 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定义 Student 类2. 配置类&#xff1a;初始化 Bean3. 测试类&#xff1a;使用 Autowired 注解自动注入 Bean4. Spring Boot 的自动装配5. 总结 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…...

Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?

Langchain vs. LlamaIndex&#xff1a;哪个在集成MongoDB并分析资产负债表时效果更好&#xff1f; 随着大语言模型&#xff08;LLM&#xff09;在实际应用中的普及&#xff0c;许多开发者开始寻求能够帮助他们更高效地开发基于语言模型的应用框架。在众多框架中&#xff0c;La…...

Java 中的内存泄漏问题及解决方案

在 Java 中&#xff0c;内存泄漏&#xff08;Memory Leak&#xff09;是指在程序运行过程中&#xff0c;某些对象已经不再使用&#xff0c;但由于引用仍然存在&#xff0c;这些对象无法被垃圾回收器回收&#xff0c;从而导致内存无法释放&#xff0c;最终可能导致系统性能下降甚…...

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

前言 开发设计时&#xff0c;通常会对业务流程进行模块化&#xff0c;有些流程之间&#xff0c;不要求同步&#xff0c;但又需要传递信息时&#xff0c;如果存储到数据库&#xff0c;效率降低很多&#xff0c;如果是存放在内存是最好的。此时可以选择系统的IPC&#xff08;进程…...

排查生产sql查询缓慢

生产投产检验&#xff0c;发现查询客户明细的接口数据响应需要5秒以上&#xff0c;通过接口可以查询到详细的后端代码 1. 先排查后端的代码实现&#xff0c;并未出现复杂逻辑&#xff0c;那么就应该是sql的问题 2. 通过explain对sql进行解析&#xff0c;发现sql没有走索引 3.…...

idea从远程gitee拉取项目

文章目录 从gitee上面拿到项目地址填写远程地址,并且设置项目保存位置拉取成功 从gitee上面拿到项目地址 填写远程地址,并且设置项目保存位置 拉取成功...

【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记

本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码&#xff0c;当执行 addLast() 与 getLast() 方法时需要遍历链表&#xff0c;效率不高&#xff0c;因此可以添加一个指向链表末尾的索引&am…...

软件测试与软件开发之间的关系

软件测试与软件开发的关系 软件测试&#xff08;Software Testing&#xff09;与软件开发&#xff08;Software Development&#xff09;是软件工程中的两个核心环节&#xff0c;它们相辅相成&#xff0c;确保软件的质量和功能满足需求。以下是两者之间的关系解析&#xff1a;…...

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 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 正文 这道题有多种解决方案 堆 比较容易&#xff0c;又比较直观的就是堆排序&#xff0c;将每个节点加入最小根堆中&…...

tp6上传文件大小超过了最大值+验证文件上传大小和格式函数

问题&#xff1a; 最近用tp6的文件上传方法上传文件时报文件过大错误。如下所示&#xff1a; $file $this->request->file(file);{"code": 1,"msg": "上传文件大小超过了最大值&#xff01;","data": {"code": 1,&q…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...