自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(197)
  • 问答 (1)
  • 收藏
  • 关注

原创 LabVIEW字符串的正常显示和16进制显示的区别

2. **实际发送的数据**: 在“十六进制显示”模式下,LabVIEW认为你输入的是一个十六进制的值01,而不是字符“0”和“1”的ASCII编码。2. **实际发送的数据**: 在“正常显示”模式下,这个“01”实际上对应的是ASCII字符“0”和“1”的编码。3. **下位机接收到的数据**: 下位机收到的是一个字节0x01,它对应的是数值1,而不是字符“0”或“1”的ASCII码。1. **输入十六进制数据**: 你在LabVIEW的输入框中选择“十六进制显示”模式,并输入“01”。

2024-08-28 14:33:35 571

原创 LabVIEW学习-LabVIEW处理带分隔符的字符串从而获取数据

实际这两个函数是对下面这个函数的封装,即电子表格字符串至数组转换函数,如果LabVIEW版本过低,大可自己写一个”分隔符字符串函至一维字符串“或者"一维字符串数组至分隔符字符串"函数。因为"数组至电子表格字符串"函数会在转换后的字符串末尾加一个换行符,因此我们需要将其剥离出来,通过截取字符串的方式,只截取换行符前面的字符,这个思想后面会使用到。带分隔符的字符串很好处理,只需要使用"分隔符字符串至一维字符串数组"函数或者"一维字符串数组至分隔符字符串"函数就可以很轻松地处理带分隔符地字符串。

2024-07-24 20:42:36 838

原创 如何让LabVIEW程序框图的图标简化,从而节省空间?

取消掉箭头所示的√即可。

2024-07-15 21:09:44 401

原创 LabVIEW学习-LabVIEW储存Excel表格

"添加至文件",意思是说要写入excel的方式,是覆盖式写入还是在原excel文件中,有数据的部分后,进行添加数据。"转置"的意思就是是横着写还是竖着写,默认是横着写,如果转置的话就会编程竖着写。"基路径“就是基本路径,"名称或相对路径"指的是在基路径上添加什么路径。所在位置,函数选板->定时->获取日期/时间(秒)函数选板->文件IO->文件常量->应用程序目录。函数选板->字符串->格式化日期/时间字符串。函数选板->文件IO->写入带分隔符表格。函数选板->文件IO->创建路径。

2024-07-13 17:36:12 1090

原创 LabVIEW学习-LabVIEW公式

2024-07-13 17:06:09 155

原创 在stm32中,所需的库函数有那些

(进入src文件夹后,将文件类型切换到C Source files(".c")后将所有文件都添加到工程中)Lib(注意区分这个Lib是从官网下载的stm32标准库文件)->CMSIS->CM3->CoreSupport。使用库函数中封装的函数来访问外设可以使得stm32开发更加方便,省去了查寄存器位操作,只用查库函数就可以了。但是使用库函数时要记住真正的其本质是获取寄存器的地址然后设置其中的位。库函数实际上分成了两块,分别是CSMIS和标准的外设驱动库。库函数一般添加到自己创建的Lib文件夹中。

2024-04-22 22:04:23 615

原创 使用STM32单片机的Keil4应该如何设置

设置Define: STM32F10X_MD,USE_STDPERIRH_DRIVER 指定你要用的是那一款处理器,这样程序就会有针对性的跳转代码,忽略分支, 使用标准驱动外设。还需要注意的是,正确的连线方式是,TP-Link连接到STM32单片机,然后TP-LINK和STM32单片机分别接上USB线,然后这两条USB线连接到电脑上。6. 在User的文件下创建main.c文件,然后再在keil中手动添加到User分组中。选中"三个正方形的按钮",点击Start分组,点击添加文件。

2024-04-19 20:06:20 651

原创 python字符切片的规则

5. 如果第一个:两边都填写了值,切片判断范围默认是左闭右开区间,如str[1:5:1],则表示从1开始(包括1),最多能取到下标为4的元素,而不能取到5。跟range一样有三个参数,分别是x:y:z,代表的含义分别为左边界,右边界(注意该范围是左闭右开的,也就是说取不到右值)和步长。1. 切片是从左往右还是从右往左,看的是步长的正负,如果步长为正值则是从左往右,步长为负则是从右往左。3. 如果第一个:左边没有填写值,如str[:5:2],则左边界默认从0开始。

2024-04-12 21:58:59 327

原创 简单学习串口通信

串口通信只需要三根线即可一位位进行通信了,分别是Tx(transmit),Rx(Receive)以及GND(Ground)三根线,分别代表的意思是发送线,接收线以及地线,发送线和接受线相连,接收线和发送线相连,地线和地线相连,这样就可以使数据一位位的顺序在两个设备之间进行通信了。第一位是起始位,是低电平,最后一位是结束位,是高电平,中间的是数据位,数据位是传输有效数据的部分。一般有8,7,5位数据长度的帧格式。需要注意的是,串口通讯两个设备之间数据帧格式和波特率的设置都要相同,否则会出现乱码的情况。

2024-03-21 15:56:58 284

原创 Qt笔记 事件分发

实际上,在事件分发和事件处理之间,事件分发器会调用一个函数叫做event,这个event所代表的含义就是我们用户要处理的这个事件,多数情况下我们对事件做任何处理,而是由事件处理函数来进行处理。当然我们也可以设置event函数来拦截事件,这样就不会分发到对应的事件处理函数上,而是在event函数就处理完了。总的来说,widget的event方法就是在处理函数调用之前进行拦截,可以针对一些事件在处理进行特殊处理。我们知道,事件的产生和处理主要分为四个部分,事件产生,事件过滤,事件分发以及事件处理。

2024-03-21 13:21:30 358

原创 Qt笔记 计时器

使用startTimer生成的计时器会在周期结束后发出计时器事件,widget对象调用计时器处理函数来处理该计时器事件。下面介绍设计计时器的两种方法,分别是利用信号与槽来使用计时器,利用计时器事件来使用计时器。使用Timer动态生成的计时器,每到周期就会发出一个timeout信号。感觉还是第一种方法信号与槽好用。1. 利用信号与槽来使用计时器。2.利用计时器事件来使用计时器。

2024-03-21 01:14:53 446

原创 Qt笔记 事件处理_鼠标事件

而且这个eventFilter是一个虚函数,我们是可以对该函数进行重写的,可以在该函数内编辑那些是可以过滤掉的。(默认情况下是不对任何事件进行过滤的),我们翻查Qt助手可以知道,QObject是QApplication的基类,因此QApplication中可以定义事件过滤,因此可以说事件过滤是main函数中的QAppliaction生成的对象a所完成的。上面所说的一系列动作都是自动完成的,这些事件函数都是回调函数,作为使用者来说,我们只需要指定函数的处理动作,关于函数是如何是如何调用的,我们不需要关心。

2024-03-21 00:10:02 764

原创 Qt笔记 标准对话框

防止内存泄漏,如果我使用new来创建对象的话,只有当主界面关闭的时候,才会调用进程对话框的析构函数,这意味着当主界面没有关闭的时候,我们可以创建无数个进程对话框然后再关闭,但是这个时候创建进程对话框的内存没有回收,这可能导致内存泄漏。当创建一个 QObject 对象并指定了它的父对象时,这个对象就会被加入到父对象所在的对象树中。什么是模态对话框,模态对话框就是对对话框后面的背景(即主界面)进行模糊化,即模态对话框弹出的时候,不能再使用背景的任何功能,直到你将模态对话框关闭。消息对话框默认是模态对话框。

2024-03-20 00:35:38 803

原创 Qt笔记 mainwindow

mainwindow是用来做应用界面的,有菜单栏,工具栏,浮动窗口,中心部件以及状态栏这几个部分组成。注意引用格式":/.../.../",这个双引号不要忘了,否则引用资源不成功。因为是状态栏,是栏,不能直接设置文本,但可以通过添加组件的方式来显示文本。如何将图片加入到工程文件,使得该工程文件调用图片不受绝对目录的影响。这样就可以做到在工程文件中引用资源,而不是依靠绝对路径。actionnew等都是菜单下的action模块。点击Open in Editor。一般的中心部件都是文本编辑器。

2024-03-19 21:48:31 403

原创 Qt笔记 信号和槽

槽是一个实实在在的函数,既要进行声明也要实现,这点上和c++中常规的函数没有什么区别,但是槽的返回值一定void类型,槽可以有参数,参数的类型和数量完全取决于你的需求,槽对参数并没有限制。可以认为信号不是一个函数,而是一个函数的声明。在Qt中,如何将两个对象进行关联,让一个对象发出信号,然后另外一个对象接收到信号后,执行该对象的一个方法,要实现这种方式,则需要使用到信号和槽机制。2. 如果信号所在的类无法直接发出信号,则在组件跳转槽中抛出一个连接好的信号槽所需的信号,从而实现间接连接信号和信号槽。

2024-03-19 12:59:28 421

原创 Qt对象树

即当我们关闭一个窗口的时候,窗口部件的销毁同时会自动销毁当前窗口里面的其他子部件,而这个子部件是会自动调用delete将相关的内存空间给释放掉,这样我们创建组件的时候,只需要写new而不用写delete。由运行结果可知,我们并没有主动调用组件MyClass的析构函数,即new后没有delete,但是该析构函数仍然被调用了,这是因为当我们关闭窗口的时候,将会调用窗口的析构函数,同时会自动调用该窗口下的组件的析构函数,而不用我们自己调用,因此在对象树的帮助下,我们只需要new而不需要delete。

2024-03-18 23:28:42 210

原创 c++11笔记 跨平台线程池

第二个参数是可调用对象(函数,函数指针,函数对象,lambda表达式),该可调用对象的返回值必须是Bool类型,当返回值为true且被notify通知的时候,将会上锁,等待取消,线程继续执行,否则线程将一直堵塞。也就就是说condition_variable会有一个上锁和解锁的操作,当执行sleep(堵塞)的时候,锁将会被释放,当被唤醒的时候,锁将会被锁上,然后判断可调用对象,来判断是否可以继续执行,可调用对象返回false则继续堵塞,返回true则执行。//将参数绑定在函数中,生成一个新的可调用对象。

2024-03-18 18:20:09 608

原创 万能引用,引用折叠,完美转发的关系

如果用了万能引用,不管你传的类型是左值还是左值引用,最后T都会被推导成左值引用,也就是int& &&a不管你传的值是右值还是右值引用,最后T都会被推导成右值引用,也就是int&& &&。一般来说上面的三个是一起搭配使用的,使用了万能引用就要考虑各种参数传进来最终推导出来的类型是什么样的,这个时候就需要懂得引用折叠的规则,推导除了最终类型,还需考虑参数类型到了函数体内会不会发生改变,有没有右值引用到了函数体被当成左值引用的情况,如果这种情况发生了怎么办,如果我们不希望这种情况发生,则要使用万能引用。

2024-03-18 00:32:45 894 1

原创 c/c++的内存分配,详细说一下栈、堆和静态存储区

静态存储区:静态存储区又叫做数据段,初始化的全局变量和初始化的静态变量都存放在静态存储区,如果没有初始化的话,就会放在另一块地方,叫做BBS段(Block By Symbol 符号开始的块)。栈区(Stack):由编译器自动分配和回收,栈中存放函数调用的相关信息,栈帧(记录函数的栈帧开始的位置),参数,局部变量,返回地址。其操作方法类似于数据结构中的栈。堆区(Heap):由程序员自己分配和释放堆中的内存空间,如果程序员没有释放则由操作系统来收回。文字常量区:存放字符串常量存放在这里,程序结束后由系统释放。

2024-03-13 19:32:13 452

原创 说说你对c和c++的看法,c和c++有什么区别?

7. c++可以使用const定义的常量来开辟数组,而c语言不可以,原因是数组的大小(如arr[SIZE]中的SIZE)必须是一个编译时常量,而在c++中,const关键字定义的常量被认为是编译时常量,而c语言不是。1. c语言是面向过程的语言,而c++是面向对象的语言,那么面向对象的语言是什么?6. c++所有非静态函数和全局变量默认是外连接而c变量和函数默认是内连接,如果是外连接的话,意味着在整个程序中都是可见的,而在c语言中内连接使得全局变量和函数只有在声明它们的源文件可见。

2024-03-13 18:58:01 299

原创 函数指针和指针函数

参数列表,函数括号里面的整个部分就代表参数列表,而特征标它包括函数名称,参数的个数,参数的类型以及参数的顺序,有时还包括const以及volatile修饰符,但是不包括返回值,函数重载和覆盖都是通过特征标来判定的,注意,这两条赋值方式效果上完全相同,我们知道函数名代表函数的地址,此处的&Test仅仅是帮助理解我们需要的是函数的地址,而不是真的去取了函数地址的地址,只是帮助理解。比如一个函数接收的一个参数是一个函数指针,则只要作为参数的函数指针的类型满足该函数,则都可以套入该函数来执行相同的操作。

2024-03-13 16:17:44 277

原创 vector与list的区别与应用?

vector和数组类似,vector是一个在内存中连续存放且可以自动增长的容器,因此支持随机访问,随机访问的时间复杂度是O(1),跟数组类型。因为是连续存放的,因此插入和删除元素的时间复杂度较高(除了在尾部进行插入和删除),原因是插入元素需要将该位置的元素后面的所有元素都移动出一格来存放该插入元素,删除就要将该位置后面的元素往前挪,因此其为O(n)。list是由双向链表实现的,双向链表就是结点有三个成员,分别是当前结点的值,指向上一个结点的指针以及指向下一个结点的指针。vector与list的区别与应用?

2024-03-13 14:54:17 454

原创 请描述一下c语言的编译链接过程

这一步主要处理源代码中的预处理指令,读取代码,对条件编译指令进行测试,确定将那些代码加入到预处理文件中,将头文件相应内容插入到源代码中,将宏定义进行替换,生成一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件。汇编器将汇编语言文件进一步翻译成机器语言文件,机器语言文件也叫做目标文件,目标文件中存放着与源代码等效的机器语言代码。源代码文件(.c或.cpp) -> 预处理文件(.i或者.ii) -> 汇编语言文件(.s) -> 机器语言文件(也叫目标文件.o) -> 可执行文件(.exe或者.out)。

2024-03-13 14:06:52 218

原创 移动构造函数

移动构造函数就是当你将一个右值引用(如临时对象)作为参数来创建对象的构造函数,移动构造函数的参数是右值引用,移动构造函数的作用就是将右值引用所指向的对象的内存空间让给移动构造函数所要生成的对象,只是将一个对象的资源转让给另一个对象,相当于把这片内存改了个名字,原来是右值引用所指向的对象拥有的内存,变成了调用移动构造函数的对象的内存,并没有开辟新的内存。移动赋值运算符也是同理,将右值引用所指向的对象所拥有的内存空间转让给了其他对象,也没有开辟新的内存。什么是移动构造函数和移动赋值运算符?

2024-03-13 12:41:14 255

原创 介绍一下左值右值,左值引用和右值引用

右值在c++11中又分为纯右值和将亡值,常量和临时变量都是纯右值,纯右值就是传统意义上的右值,纯右值在它的表达式结束后就会被销毁。详细的说,左值是有明确的地址,是具有名字的,是可以对左值进行取地址操作的,因为它在内存中有明确的地址和名字,可以赋值也可以被赋值,比如说变量,数组等都是左值。右值在内存中没有明确的地址,没有名字,不能长期在内存中驻留,不能对右值进行取地址的操作。先说左值和右值,简单来说可以放到等号左边的值叫做左值,可以放到等号右边的值叫做右值。

2024-03-13 12:18:03 159

原创 重载和覆盖以及隐藏有什么区别?

重新定义,我们知道重新定义将隐藏方法,在派生类重新定义方法有点像重载,但是重载一般发生在一个类中而且不要求像重写一样参数列表和函数名都相同,而这里的重新定义发生在派生类中,此时派生类将隐藏基类的同名方法,而只使用派生类重新定义的同名方法。重写指的是派生类重写基类的方法,更改方法的行为,需要注意的是重写基类的方法要求派生类的方法必须与基类的方法具有完全相同的方法名以及参数列表,这时候如果通过派生类对象调用派生类方法的时候将会调用派生类的方法而不是基类的方法。重载和重写以及重新定义(隐藏)有什么区别?

2024-03-12 18:36:00 225

原创 介绍一下c++中的多态

在运行的时候才确定调用的是哪个函数,这种方式叫做动态连接,或者叫做晚绑定,实现的主要手段有重写(也叫覆盖),以及虚函数,比如基类中有一个方法使用了虚函数,基类的指针可以指向基类的对象也可以指向派生类的对象,在该方法使用了虚函数的情况下,要根据所指向的对象来调用方法,因此说运行的时候才确定调用的是哪个函数。是在编译时就确定了函数的类型和会调用哪个函数,这种方式叫做静态连接或者早绑定,静态多态主要实现手段有函数重载,运算符重载以及使用模板,这些都是在编译时就确定了函数的类型。

2024-03-12 16:46:20 148

原创 const的用法

而且我认为是形参的const指针和实参的const指针根本不是一个东西,可以看到输出的地址根本不一样,只是所指向的内存空间一样罢了,你在函数里面修改形参的指针与外面实参的指针无关。由上面const指针和被const修饰的指针可以知道,被const修饰的指针是可以改变所存储地址,但是不能改变所指向的内容的。如果形参是被const修饰的指针,那么这个指针是不允许修改所指向变量的值还是不允许修改指针本身所存储的地址?可见,被const修饰的形参指针是无法修改所指向的值的,那么可以修改指针所存储的变量地址吗?

2024-03-12 14:37:39 323

原创 static的用法和作用

如果定义的是静态类成员,比如静态成员变量和静态成员函数。其原因是,静态变量和全局变量都是存储在静态存储区(程序的数据段),而非栈区,局部变量存储在栈上,当函数调用结束时,栈上的内存将会被自动清理,所以局部变量会被消除。报错,说找不到静态函数fun的定义,所以我们说静态成员函数只有定义了它所在的文件可以调用,但是全局的函数non_static_fun是可以被调用的。在一个函数中定义静态局部变量的时候,该静态局部变量的生命周期将贯穿整个程序的运行期,而不会像局部变量一样函数运行结束的时候就被销毁。

2024-03-12 13:18:18 302

原创 c++ primer plus笔记 第十八章 探讨c++新标准

一般来说,构造函数,析构函数,赋值运算符,取地址运算符以及私有成员函数是派生了无法继承的,如果像继承基类的构造函数,则可以使用using来让派生类继承基类的所有构造函数,使用这种方法一般是因为基类的构造函数比较完整,用基类的构造函数就可以完成初始化,这样就可以省去重新定义一个和基类构造函数干相同事情的操作,即使用基类的构造函数却可以创造一个派生类的对象,我们一般说的构造函数无法继承的意思是说无法用基类的构造函数直接创建一个派生类的对象。而右值引用可以修改引用所指向的对象,右值引用一般用于移动语句。

2024-03-11 17:44:22 900

原创 c++ primer plus 笔记 第十六章 string类和标准模板库

如果只给string字符串分配string字符串大小的空间,当一个string字符串附加到另一个string字符串上,这个string字符串是以占用相邻内存的方式进行扩容的,相邻的内存不够存放这个附加的字符串的时候,就需要将拼接起来的这两个string字符串迁移去一个新的内存空间来存放,如果多次这样的分配,会使得效率就很低。即在unique_ptr中,交出所有权后消失是允许的,交出所有权后仍然存在在程序中这是不被允许的,即程序中存在被遗弃的智能指针,有被操作的风险。

2024-03-10 01:59:02 1020

原创 虚函数与纯虚函数有什么区别?

除了纯虚函数是派生类必须实现的,其他都是根据自己的需求看自己想不想重写该虚函数,在派生类需要有不同的行为,那么就需要重写该虚函数。而纯虚函数是必须要提供实现的。派生类一定要定义继承而来的虚函数嘛?

2024-03-09 11:45:49 340

原创 c++ primer plus 第十五章笔记 友元,异常和其他

我们知道函数的调用是一个压栈的过程,此时函数c抛出异常后,将会直接结束函数c运行,退回到上一个函数的调用,即出栈,到函数b,在函数b中寻找能够处理该异常类型的catch异常处理函数,找不到直接退栈不会执行该函数的内容,再往前找,直到找到能够处理该异常类型的catch异常处理函数为止,如果退到最后main函数都没有能处理这个异常类型的catch异常处理函数,则结束程序运行,这个就是栈解退,即异常抛出后就会往回倒,找到能满足条件的函数,找不到就程序运行结束。什么是循环引用和循环依赖?

2024-03-08 23:14:59 757

原创 私有派生和公有派生是不是都会在派生类创建一个基类的无名对象?

私有派生会在私有派生类中创建一个无名的基类对象,而公有派生不会创建一个无名的基类对象,而是将基类的成员作为其自己的成员,原来什么属性在公有派生类中就是什么属性,但是公有派生类无法直接访问继承而来的公有基类的成员变量。并不是,只有私有派生会,公有派生不会,私有派生的私有派生类中会创建一个私有基类的无名对象,而公有派生是将公有基类成员变成公有派生类的一部分,原来是什么样在公有派生类中就是什么样。,公有派生类无法直接访问公有基类的私有成员,只能通过调用继承的公有基类的方法来操作公有派生类的私有成员。

2024-03-08 12:31:55 213

原创 在多文件编译时,如果模板类的成员函数的定义和模板类不在一个文件下会怎么样?

编译器将找不到成员函数的定义,哪怕你将存放成员函数定义的test.cpp一块编译,编译器也无法找到该模板类的成员函数的定义。将模板类的声明和成员函数定义都定义在.h文件下。

2024-03-07 19:06:46 183

原创 408树与二叉树

在是完全三叉树的情况下可以使得其高度最小,设高度为h,则有3^0+3^1+...+3^h = n(总结点数),n = 1/2 * 3^h,当n = 50的时候,求得h = 5。树中结点个数 = 非叶子结点个数(有度的结点) + 叶子结点个数;数据结构笔记二叉树与树_柘木木的博客-CSDN博客。平衡二叉树(AVL树)_柘木木的博客-CSDN博客。数据机构笔记哈夫曼编码_柘木木的博客-CSDN博客。二叉查找树(BST)_柘木木的博客-CSDN博客。数据结构笔记并查集_柘木木的博客-CSDN博客。

2023-02-13 15:55:25 361 1

原创 数据机构笔记哈夫曼编码

让果堆作为叶子结点,权值为果堆的重量,那么非叶子结点就是合并出来的果堆的质量,也可以说是合并这次消耗的体力值,那么从根结点到叶子结点的和就是总共消耗的体力值,这样遍历所有到叶子结点的路径(非叶子结点之和)即可找出最小消耗体力值。如果是先12,则得到一个3的果堆,消耗体力为3,再和3合并,33,得到一个6的果堆,消耗体力为6,总共消耗体力为(3+6) = 9。如果先13,得到一个4的果堆,消耗体力为4,再和2合并,42,得到一个6的果堆,消耗体力为6,总共消耗体力为(4+6) = 10。

2023-02-12 23:07:01 281

原创 数据结构笔记堆

完全二叉树的叶子结点个数等于n/2(偶数等于n/2, 奇数等于n/2+1,因为这里不影响,n/2求出来的是最后一个非叶子结点的下标),下标1到n/2全部都是非叶子结点,n/2以后的都是叶子结点;//先左右孩子进行比较,找出最大的再和要调整的父亲结点进行比较,如果大于就交换二者的值,交换后处理的结点的下标要改成原来被交换孩子的下标,逐层向下调整,直到该结点的值是其子树的最大值为止。的父亲结点的值小于或者等于孩子结点的值,以它为根结点的子树,它是最小值。(顶点是最大值,顶点指的是树的根结点或者子树的根结点)

2023-02-09 20:47:55 430

原创 数据结构笔记并查集

用数组father[ i ]来表示树中结点和父亲的关系,下标i代表某结点,father[ i ]代表i的父亲结点,i == 2 , father[ i ] == 1 ,则说明结点2的父亲是1。//为什么是路径上的结点而不是全部结点,因为我们只能网上查找,查找点往下的元素是多少,是什么样的树我们不得而知,因此只能处理查找元素以上的结点,将其指向根结点。//也学能承受一次查找,但是多次查找时间复杂度会更高,如果路径压缩只需要承受一次(找到根结点)以后,后面查找的时间复杂度就都是O(1)2.并查集的基本操作。

2023-02-08 22:41:21 193

原创 平衡二叉树(AVL树)

左旋的过程中,A作为B的左孩子(向左扭过去),B多出了一个孩子,A刚好缺少一个右孩子(多一个补一个)因为深棱形是A的后继,比A大,应该作为A的右孩子。引入二叉查找树中的前驱和后继的概念,则A的前驱是五角星,A的后继是深棱形,A的后继是大于A的最小值,放到数列里面就是A后面的哪个值。//二叉查找树是按一定规律建造的,因此不能随意修改二叉查找树的值,因此基本操作不包括修改,删除操作较为复杂,这里主要讲查找,B的左孩子向右边扭,B作为A的右孩子,A多了一个右孩子,B少了一个左孩子,A的左孩子来到B作为其左孩子。

2023-02-07 20:48:49 649

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除