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

LeetCodehot100 力扣热题100 二叉树展开为链表

代码思路

目标:

将二叉树展平(flatten)为一个单链表。展平后的链表应该按照前序遍历的顺序排列节点,即:

• 节点的左子树指针设置为 nullptr。

• 节点的右子树指针指向下一个节点。

代码注释及思路


class Solution {public:// flatten函数:将二叉树转化为链表void flatten(TreeNode* root) {vector<TreeNode*> l; // 用来存储前序遍历的节点preorderTraversal(root, l);  // 先进行前序遍历并将节点加入到l中int n = l.size();  // 记录前序遍历中节点的个数// 连接所有节点,使其形成链表for (int i = 1; i < n; i++) {TreeNode *prev = l.at(i - 1), *curr = l.at(i);prev->left = nullptr;  // 将前一个节点的左指针置为NULLprev->right = curr;    // 将前一个节点的右指针指向当前节点}}// preorderTraversal函数:前序遍历二叉树,并将每个节点加入到vector l中void preorderTraversal(TreeNode* root, vector<TreeNode*> &l) {if (root != NULL) {  // 如果当前节点不为空l.push_back(root);  // 将当前节点加入到vector lpreorderTraversal(root->left, l);  // 递归遍历左子树preorderTraversal(root->right, l); // 递归遍历右子树}}};

l.at(i - 1) 和 l[i - 1] 在大多数情况下会表现得很相似,但它们有一些关键的区别,主要体现在安全性和异常处理上。

1. l.at(i - 1)

安全性:at() 是 std::vector 的一个成员函数,它会检查你传入的索引是否越界。如果索引超出了有效范围,它会抛出一个 std::out_of_range 异常。

行为:如果你访问了一个无效索引(比如负数或者超出了 vector 的大小),at() 会立即抛出异常,从而帮助你捕捉潜在的错误。

std::vector<int> v = {10, 20, 30, 40};

try {

    std::cout << v.at(5) << std::endl;  // 抛出 std::out_of_range 异常

} catch (const std::out_of_range& e) {

    std::cout << "Out of range: " << e.what() << std::endl;  // 会打印异常信息

}

2. l[i - 1]

安全性:operator[] 是 std::vector 的索引访问方式,它不会做越界检查。如果你使用一个无效的索引,它不会抛出异常,而是会产生未定义行为,可能导致程序崩溃、访问到非法内存等问题。

行为:即使访问了一个超出范围的索引,它也不会报错,而是直接返回一个非法的内存位置。

std::vector<int> v = {10, 20, 30, 40};

std::cout << v[5] << std::endl;  // 未定义行为,可能导致程序崩溃或异常

• at(i):比 operator[] 更安全,因为它会进行边界检查并抛出异常。

• operator[]:更加高效,因为没有进行边界检查,但使用不当会导致程序崩溃或产生不可预料的行为。

哪个更好?

• 如果你确定索引是有效的,或者你对代码的安全性非常关注,使用 operator[] 会更高效。

• 如果你更关心代码的安全性,尤其是在你不确定索引是否有效的情况下,使用 at() 更加可靠。

详细思路

1. 前序遍历

• 在 flatten 函数中,首先调用 preorderTraversal 对二叉树进行前序遍历。前序遍历的顺序是:根节点 → 左子树 → 右子树。

• 在 preorderTraversal 函数中,当访问一个节点时,将它加入到一个 vector<TreeNode*>(即 l)中。

• 递归进行左子树和右子树的遍历。

2. 重建链表

• 在完成前序遍历后,l 中存储了按前序遍历顺序排列的所有节点。

• 接下来,遍历这个 l,并对每一对相邻节点(prev 和 curr)做以下操作:

• 将 prev 节点的左指针置为 nullptr。

• 将 prev 节点的右指针指向 curr 节点。

• 这样,我们将树的结构变为链表,且节点按照前序遍历顺序排列。

运行步骤

假设输入的二叉树如下:

    1

   / \

  2   5

 / \   \

3   4   6

1. 调用 flatten(root),传入根节点 1。

2. 调用 preorderTraversal(root, l),此时开始前序遍历:

• l = [1](根节点 1)

• 遍历左子树,l = [1, 2]

• 遍历 2 的左子树,l = [1, 2, 3]

• 遍历 2 的右子树,l = [1, 2, 3, 4]

• 遍历右子树,l = [1, 2, 3, 4, 5]

• 遍历 5 的右子树,l = [1, 2, 3, 4, 5, 6]

3. 现在,l = [1, 2, 3, 4, 5, 6],即按前序遍历顺序排列的节点。

4. 接着,连接这些节点:

• prev = 1, curr = 2 → 1->left = nullptr, 1->right = 2

• prev = 2, curr = 3 → 2->left = nullptr, 2->right = 3

• prev = 3, curr = 4 → 3->left = nullptr, 3->right = 4

• prev = 4, curr = 5 → 4->left = nullptr, 4->right = 5

• prev = 5, curr = 6 → 5->left = nullptr, 5->right = 6

最终的链表结构如下:

1 -> 2 -> 3 -> 4 -> 5 -> 6

复杂度分析

时间复杂度:O(n),其中 n 是树中节点的数量。我们对树进行了一次前序遍历,遍历过程的时间复杂度是 O(n)。在重新连接节点时,也只需要遍历一次 l。

空间复杂度:O(n),主要是用于存储前序遍历结果的 vector l,其大小为 n。递归栈的深度是树的高度,最坏情况下是 O(n),最好的情况下是 O(log n)(如果树是平衡的)。

相关文章:

LeetCodehot100 力扣热题100 二叉树展开为链表

代码思路 目标&#xff1a; 将二叉树展平&#xff08;flatten&#xff09;为一个单链表。展平后的链表应该按照前序遍历的顺序排列节点&#xff0c;即&#xff1a; • 节点的左子树指针设置为 nullptr。 • 节点的右子树指针指向下一个节点。 代码注释及思路 class Solution…...

2.14学习总结

#include <stdio.h> #include <stdlib.h> #include <math.h>#define MAX_N 32767// 二分查找最接近目标值的元素 int binarySearch(int* arr, int left, int right, int target) {while (left < right) {int mid left (right - left) / 2;if (arr[mid] …...

在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程

既然我们已经在本地部署了DeepSeek,肯定希望能够利用本地的模型对自己软件开发、办公文档进行优化使用,接下来就先在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档的教程奉上。 前提: (1)已经部署好了DeepSeek,可以看我的文章:个人windows电脑上安装DeepSe…...

zola + github page,用 workflows 部署

之前的Zola都是本地build之后&#xff0c;再push到github上&#xff0c;这种方式很明显的弊端就是只能在本地编辑&#xff0c;而不能通过github编辑&#xff0c;再pull到本地&#xff0c;缺乏了灵活性。因此将zola用workflows来部署。 repo地址&#xff1a;https://github.com/…...

【科技革命】颠覆性力量与社会伦理的再平衡

目录 2025年科技革命&#xff1a;颠覆性力量与社会伦理的再平衡目录技术突破全景图认知智能的范式转移量子霸权实现路径生物编程技术革命能源结构重构工程 产业生态链重构医疗健康新范式教育系统智能进化金融基础设施变革制造范式革命 科技伦理与文明演进 2025年科技革命&#…...

UIView 与 CALayer 的联系和区别

今天说一下UIView 与 CALayer 一、UIView 和 CALayer 的关系 在 iOS 开发中&#xff0c;UIView 是用户界面的基础&#xff0c;它负责处理用户交互和绘制内容&#xff0c;而 CALayer 是 UIView 内部用于显示内容的核心图层&#xff08;Layer&#xff09;。每个 UIView 内部都有…...

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description&#xff1a;任务描述 勾选 Discard old builds Discard old builds&#xff1a;控制何时…...

深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现

1. A2DP概述 A2DP&#xff08;Advanced Audio Distribution Profile&#xff09;是一种高质量音频流媒体协议&#xff0c;旨在实现高质量音频内容的分发&#xff0c;通常用于通过蓝牙设备传输音频数据&#xff0c;例如将音乐从便携式播放器传输到耳机或扬声器。与传统的蓝牙语…...

mybatis-plus逆向code generator pgsql实践

mybatis-plus逆向code generator pgsql实践 环境准备重要工具的版本供参考pom依赖待逆向的SQL 配置文件CodeGenerator配置类配置类说明 环境准备 重要工具的版本 jdk1.8.0_131springboot 2.7.6mybatis-plus 3.5.7pgsql 14.15 供参考pom依赖 <?xml version"1.0&quo…...

Android Studio:RxBus结合ICompositeSubscription使用

我现在想用 RxBus 来发布和订阅事件&#xff0c;同时使用 ICompositeSubscription 来管理订阅。跟前一个博客的区别在于&#xff0c;事件流的产生方式不同&#xff0c;更加得全面。 目标 使用 RxBus 发布事件。使用 ICompositeSubscription 来管理订阅。在 Activity 中创建订…...

微软AutoGen高级功能——Magentic-One

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢&#xff0c;我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统&#xff0c;用于…...

redis cluster测试

集群节点信息这时候停掉一个master 172.30.60.31 从集群信息集中我们可以看到172.30.60.31的slave是172.30.60.41&#xff0c;查看41的日志&#xff0c;发现他成为了新的master 这时候我们在将172.30.60.41也杀死&#xff0c;会发现集群异常了 尝试把172.30.60.31启动&#xff…...

【ARM】JTAG接口介绍

1、 文档目标 对 JTAG 接口有更多的认识&#xff0c;在遇到关于 JTAG 接口问题时有一些排查的思路。 2、 问题场景 在使用调试器过程时&#xff0c;免不了要接触到 JTAG 接口&#xff0c;当出现连接不上时&#xff0c;就不知道从哪来进行排查。 3、软硬件环境 1 软件版本&am…...

处理项目中存在多个版本的jsqlparser依赖

异常提示 Correct the classpath of your application so that it contains a single, compatible version of net.sf.jsqlparser.statement.select.SelectExpressionIte实际问题 原因&#xff1a;项目中同时使用了 mybatis-plus 和 pagehelper&#xff0c;两者都用到了 jsqlpa…...

部署 DeepSeek R1各个版本所需硬件配置清单

DeepSeek-R1 通过其卓越的推理性能和灵活的训练机制&#xff0c;在 2025 年的春节期间受到了广泛关注。 DeepSeek-R1 是一款高性能的 AI 推理模型&#xff0c;主要通过强化学习技术来增强模型在复杂任务场景下的推理能力。 在本地部署 DeepSeek-R1 时&#xff0c;尤其是完整的…...

数据结构:Map Set(一)

目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 &#xff08;1&#xff09;纯key模型 &#xff08;2&#xff09;Key-Value模型 三、Map的使用 1、什么是Map&#xff1f; 2、Map的常用方法 &#xff08;1&#xff09;V put(K …...

zabbix 监控系统 配置钉钉告警

步骤1&#xff1a;创建钉钉群 步骤2&#xff1a;创建机器人 点击群设置 然后下划选择机器人。 点击添加机器人 选择自定义机器人 点击添加 1、设置机器人的名字和群组 2、设置自定义关键字 zabbix 告警 报警 恢复 3、点击我已阅读并同意 4、点击完成 生成webhook 链接 注…...

跟着李沐老师学习深度学习(十一)

经典的卷积神经网络 在本次笔记中主要介绍一些经典的卷积神经网络模型&#xff0c;主要包含以下&#xff1a; LeNet&#xff1a;最早发布的卷积神经网络之一&#xff0c;目的是识别图像中的手写数字&#xff1b;AlexNet&#xff1a; 是第一个在大规模视觉竞赛中击败传统计算机…...

32单片机学习记录4之串口通信

32单片机学习记录4之串口通信 前置 STM32的GPIO口有通用模式&#xff0c;复用模式&#xff0c;模拟模式三种&#xff0c;加上输入输出就是有6中对应的模式。 我学习了通用模式&#xff0c;会使用GPIO口使用一些简单外设&#xff0c;如LED&#xff0c;独立按键&#xff0c;红外…...

微信小程序 - 组件和样式

组件和样式介绍 在开 Web 网站的时候&#xff1a; 页面的结构由 HTML 进行编写&#xff0c;例如&#xff1a;经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写&#xff0c;例如&#xff1a;经常会采用 .class 、#id 、element 等选择器 但在小程序中不能…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...