- 博客(84)
- 收藏
- 关注
原创 二叉树进阶 之 【模拟实现二叉搜索树】(递归、非递归实现查找、插入、删除功能)
替换之后,需要删除的节点就变为了左子树或右子树中键值与删除节点替换前的键值一致的节点,所以,在查找左子树的最大键值或右子树的最小键值仍。树为空,root 是 _root 的别名,root 指向 新创建的节点,_root 也指向 新创建的节点。树不为空时,位置的查找与前面讲的节点的查找差不多,只是,找到插入位置后,我们不仅。选用删除节点的左子树的最大键值或右子树的最小键值与删除节点的键值进行替换操作。正如删除键值为 6 的树节点一样,只需让父亲节点指向右子树,但是,
2025-08-11 16:00:14
180
原创 C++ 之 【反向迭代器的简介与简单模拟实现】
通过对给定的正向迭代器的封装,C++将反向迭代器设计为一种迭代器适配器以实现其反向遍历容器的功能反向迭代器与普通迭代器的遍历方向相反,但提供相同的接口(如operator*operator++等),使得反向遍历的代码风格与正向遍历一致如上,反向迭代器设计的始末位置与正向迭代的始末位置互为镜像对称这一特点在后续的解引用操作设计上会有体现。
2025-08-03 15:12:48
1101
原创 C++ 之 【模拟实现 优先级队列】
less、greater已经满足大多数优先级队列的创建要求,但还是有些例外,如下public:{}private:int _year;int _month;int _day;上述代码是自定义类型Date类while (!pq.pop();while (!pq1.pop();上述测试用例中,pq存储的类型是Date,而Date类重载了>、<运算符,使得pq得以根据需要进行创建pq1存储的类型是Date*,仿函数的对象实例只会根据地址大小创建优先级队列,
2025-08-03 11:54:13
763
1
原创 C++ 之 【优先级队列、仿函数的简介】
在C++中,(优先级队列)是一个容器适配器,它默认使用和堆算法实现优先级队列的功能。优先级队列的底层数据结构可以视为堆,但优先级队列本身是更高层次的抽象。
2025-08-03 10:18:15
471
原创 常见排序的特性总结
1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1),它是一种稳定的排序算法4.稳定性:稳定当元素等于前一个元素时,可选择将该元素放置到前一个元素后,此时可保证排序稳定1. 希尔排序是对直接插入排序的优化2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。
2025-07-30 11:53:23
647
原创 数据结构之 【排序】(非递归实现快速排序)
先将起始区间边界存入栈中,然后取出边界,进行快排的单趟排序得到分界位置的下标,以此为界将数组分割为左右两部分,然后先将右部分的区间边界存入栈中,再将左部分的区间边界存入栈中(区间大小大于1才将边界存入栈中),再从栈中取出区间边界进行单趟排序,再分割数组并存入区间边界....直到栈为空为止。递归调用实现快速排序类似于二叉树的前序遍历(根、左子树、右子树)注意边界的存入方式 、小规模数组可以进行优化。这种结构以模拟递归实现快排时的。递归不可避免的话题就是。的能力 ,一般来说,
2025-07-25 18:37:02
306
原创 数据结构 之 【排序】(递归实现快速排序)
当中选择中位数这里我们返回该元素的下标,便于后续交换int midi = (left + right) / 2,可能会导致溢出。
2025-07-25 17:55:47
833
原创 数据结构 之 【链式二叉树】(C语言实现二叉树的前序中序后序层序遍历,节点个数、树的高度、第K层的节点个数、查找、完全二叉树的判别、销毁创建二叉树)
1不为空,先计算1的左子树(根节点存储值为2)的高度,2不为空,先计算2的左子树(根节点存储值为3)的高度,3不为空,先计算3的左子树的高度,树为空,返回0,再计算3的右子树的高度,树为空,返回0,比较返回1,(即2的左子树(根节点存储值为3)的高度),再计算2的右子树的高度,树为空,返回0,比较返回2,(即1的左子树(根节点存储值为2)的高度),此时该树的左子树的高度计算完毕,开始计算其右子树的高度..........(不为空)入队,然后在出队的同时,将该节点的左右孩子节点入队,队列为空时就停止。
2025-07-11 15:15:00
450
原创 数据结构 之 【堆】(堆的概念及结构、大根堆的实现、向上调整法、向下调整法)(C语言实现)
那么我们就先假设左孩子节点的值较大,再将左孩子节点的值与右孩子节点值进行比较,更新孩子节点,然后与父亲节点的值进行比较,从而简化比较交换操作。堆只要求了父亲节点与子节点值之间的关系,并没要求兄弟节点、堂兄弟节点值之间的关系。如果该节点数据比其孩子节点中的较大值小就进行交换,否则就不动,最终实现大堆。(1)父亲节点有孩子节点时,就需要与孩子节点的值进行一次比较,所以。依次找到尾节点的祖先节点,然后比较数据大小,大就交换,小就停止交换。然后与孩子节点中的较大值进行比较,大就交换,小就停止交换。
2025-07-04 16:02:07
960
原创 数据结构之 【树的简介】(树的(相关)概念、二叉树的概念、部分性质、满二叉树、完全二叉树)
1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为():一棵高度为 K 的二叉树,其前 K−1 层均为满二叉树结构,且第 K 层的所有节点均。非终端节点或分支节点:度不为0的节点;:若一个节点含有子节点,则这个节点称为其子节点的父节点;:以某节点为根的子树中任一节点都称为该节点的子孙。:一个节点含有的子树的根节点称为该节点的子节点;兄弟节点:具有相同父节点的节点互称为兄弟节点;想要增加B的兄弟节点,就在C后面尾插,想要增加B的子节点,就在E后面尾插。
2025-07-01 15:51:31
845
原创 C++ 之 【deque的简介】
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和 删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比 较高双端队列底层是一段假象的连续空间,实际是分段连续的通常从中控数组(指针数组)的中间元素所指向的buffer开始存储数据,尾插就是在buffer中从前往后存放数据,一个buffer满了就再创建一个相同的buffer进行存储此时,指向新的buffer的指针放在中控数组的逻辑末尾。
2025-06-30 11:09:29
822
原创 C++ 之 多态 【虚函数表、多态的原理、动态绑定与静态绑定】
需要声明的,这期博客的代码及解释都是在vs202022下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题 等等。
2025-06-01 19:32:45
835
原创 C++ 之 多态【多态的概念、多态构成的条件、虚函数的概念、虚函数的重写、override\final、重载重定义重写的对比、抽象类的概念、接口继承与实现继承】
多态是在不同继承关系的类对象去调用同一函数时,产生的不同的行为那么在继承中要构成多态还有两个条件:1.必须通过基类的指针或者引用去调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout << "票价-成人票" << endl;public:cout << "票价-学生票" << endl;Func(&p);Student s;Func(&s);return 0;(1)重载就是指。
2025-05-31 14:58:40
750
原创 C++ 之 【模板进阶(非类型模板参数、模板的特化、模板的分离编译、模板中的嵌套类型)】
这是最常见的做法。将模板的完整定义(包括实现)放在头文件中,这样任何包含该头文件的源文件都能看到完整的模板定义,从而能够实例化所需的模板既可以完整实现。
2025-05-25 13:44:03
715
原创 C++ 之 继承【.继承的概念及定义、基类和派生类对象的赋值转换、继承中的作用域、派生类的默认成员函数、继承和友元、继承和静态成员、菱形继承及菱形虚拟继承、继承的反思与总结】
Person是父类,也称作基类。Student是子类,也称作派生类(1)可以实现多继承,但一定不要设计出菱形继承。否则在复杂度及性能上都有问题继承与组合(1)public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象(2)在继承方式中,基类的内部细节对子类可见。继承一定程度破坏了基类的封装,基类的改变,对派生类有很 大的影响组合类之间没有很强的依赖关系,实际尽量多去用组合。
2025-05-18 20:43:47
693
原创 C语言 之【队列的简介、队列的实现(初始化、销毁、入队、出队、判空、元素个数、元素的访问)】
队列是一种数据结构,也是一种特殊的线性表队列只允许在一端进行插入数据操作,在另一端进行删除数据操作进行插入数据操作的一端叫作队尾, 进行删除数据操作的一端叫作队头队列遵守先进先出FIFO(First In First Out)原则就像生活中顾客按到达顺序排队到超市收银员处结账一样,新顾客加入队尾,服务从队头开始,排在队头的顾客先结账离开插入数据操作,简称入队;删除数据操作,简称出队。
2025-05-02 17:06:20
1241
原创 C语言 之 【栈的简介、栈的实现(初始化、销毁、入栈、出栈、判空、栈的大小、访问栈顶元素、打印)】
栈是一种数据结构,是一种特殊的线性表,栈只允许在一端进行插入和删除数据的操作进行数据插入和删除操作的一端称为栈顶,另一端称为栈底栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。可以把栈理解为一个垃圾桶,先丢进去的垃圾在桶底,后丢进去的东西会覆盖在表面(即在桶顶)只有先倒出桶顶的垃圾,才能倒出桶底的垃圾压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶出栈:栈的删除操作叫做出栈。出数据也在栈顶。
2025-05-02 13:32:57
1137
原创 C++ 之 【模拟实现 list(节点、迭代器、常见接口)】(将三个模板放在同一个命名空间就实现 list 啦)
此时,该迭代器类的对象就是链表的迭代器。
2025-04-28 17:31:13
1083
原创 C++ 之 【list的简介、list 的构造函数、iterator、容量操作、元素访问、增删查改与迭代器失效】
(1)的底层通常实现为,支持在任意位置插入、删除。
2025-04-28 13:53:07
745
原创 C++ vector 之 【模拟实现vector须知、完整的模拟实现 】
vector是一个类模板所以模拟实现时,我将在.h文件中完整模拟实现vector(3)vector可以被理解为一个动态数组,模拟实现一个动态数组时,我们选择在堆上去申请空间,
2025-04-20 17:10:46
1153
原创 C++ 之 【vector的4种构造函数、vector iterator 的使用、vector 的空间问题、vector 的增删查改、vector中的迭代器失效问题】
vector是一个类模板vector是表示动态数组的序列容器,元素在内存中连续存放,支持通过下标直接访问(1) 显而易见,vector类似于静态数组但无需固定大小,因为它能"自动"管理内存大小当元素数量超过当前容量时,自动分配更大的连续内存(通常按 1.5~2 倍增长),并将原有元素迁移至新空间(2)除此之外,vector还提供了多种成员函数来操作元素,如pop_back()insert()erase()size()capacity()等。
2025-04-20 12:18:29
979
原创 string类 之 【常用接口简介】本文的代码示例都已包含头文件且展开了命名空间std
size()返回字符串中字符的数量(长度),以字节为单位。// 输出5length()功能与size()相同,返回字符串的长度。// 输出5capacity()返回当前为字符串分配的存储空间大小(容量),以字节为单位。// 输出20empty()检查字符串是否为空,若为空返回true,否则返回false。// 输出1(true)clear()清空字符串内容,将其长度置为0,但保留已分配的存储空间。// 输出0reserve()预留至少n个字符的存储空间,避免频繁的内存重新分配,提高性能。
2025-04-09 17:20:03
970
原创 C++之 【模板初阶(函数模板与类模板)】
类模板是一个与具体数据类型无关的通用类定义具体来说就是,类模板代表了一个类家族该类模板中的类型被参数化,编译器根据实参类型产生类的特定类型版本。
2025-03-22 15:13:00
988
原创 C/C++内存管理(new、delete)
(1)对于单个对象空间的开辟与释放,delete p2;new 类名-即可完成空间的开辟,再创建指针变量接收该空间的地址就好想要在开辟空间的同时进行初始化类名后面加上 (初始值,..)即可注意此处传参实际上是传给构造函数,传参的实际情况根据构造函数而定delete 指针名-即可完成空间的释放(1)申请和释放多个对象,new 类名[size]-即可完成连续空间的开辟,再创建指针变量接收该空间的地址就好想要在开辟空间的同时进行可以全部对象都进行初始化,也可以部分对象进行初始化。
2025-03-21 17:30:49
590
原创 C++类和对象之 【日期类的实现】(.h文件中声明,.cpp文件中定义)
(1)重载+, 会创建两个临时对象,所以我们选择在 重载+ 时去复用+=(1)默认大日期、默认小日期,用max、min替换(使代码更简洁)(1)创建一个数组存放每一个月的天数,判断闰年返回即可。(1)因为大小比较时,日期对象不会发生改变,加上。只需写一个判断小于的函数和一个判断等于的函数。(1)先判断是否是2月,在判断是否是闰年,调用任意一个运算符都会进行对象的创建,代码。(2)临时对象的创建,注意返回值类型即可。(1)this指针在函数体中的使用。(1)为了连续的输入输出,需要。
2025-03-19 17:28:27
620
原创 C++类和对象(下) 之 【初始化列表、explicit关键字、static成员、友元、内部类、临时对象】
声明为static的类成员称为类的静态成员用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化用static修饰的 成员函数,称之为静态成员函数在C++中,友元(friend)是一种机制它允许一个类或函数访问另一个类的私有(private)和保护(protected)成员。友元不是类的成员函数,但它可以像类的成员函数一样访问类的私有和保护成员。友元关系打破了类的封装性,因此在使用时需要谨慎----文心一言友元分为友元类和友元函数创建一个对象,该对象没有名字,形如。
2025-03-18 17:06:50
932
原创 C++类和对象(中) 之 【运算符重载、赋值运算符重载、前置++与后置++、const成员、取地址及const取地址操作符重载】
时,往往会遇到。
2025-03-14 19:38:31
830
原创 C++类和对象(中) 之 【构造函数、析构函数、拷贝构造函数】
用户有定义构造函数之后编译器当然要选择不再生成构造函数,不然当编译器自动生成的无参构造函数与用户显式定义的无参或全缺省函数冲突时,编译器该调用哪个构造函数呢?(1)析构函数不能被重载,这是因为它没有参数且无返回值(1)如果一个类中有多个析构函数,可能会导致同一块内存被多次释放、编译器无法确定该调用哪一个析构函数等未定义行为class Timepublic:Time()_hour = 14;
2025-03-11 15:07:48
856
原创 C++类和对象(上) 之 【封装与类的语法特点、定义、访问限定符、对象模型与this指针】
C语言中,定义一个自定义类型需要用到关键字structC++兼容C语言,定义一个自定义类型也可以用 struct但C++更喜欢用class来替代class 类型名//类体(1)如上,就定义了一个类(1)class是定义类的关键字(1)注意结尾的分号类体中的内容叫作类中的变量叫作类的属性或成员变量类中的函数叫作类的方法或成员函数成员函数在类中定义,可能会被编译器当作内联函数进行处理2.声明放在.h文件中,定义放在.cpp文件中,注意:在.cpp文件中定义的函数需要在函数名前加上。
2025-03-07 20:11:50
703
原创 C++入门 之 【内联函数、C++11中的auto、基于范围的for循环与指针空值 nullptr】
因为被编译器视为内联函数的函数体会被直接展开编译器在编译阶段将该函数体展开而。
2025-03-04 15:02:40
468
原创 C++入门 之 【缺省参数、函数重载、引用】
这是规定因为形参的缺省值如果同时出现在了定义与声明中并且两处缺省值不同编译器则无法确认谁才是真正的缺省值,所以为了简化问题起见,直接规定缺省参数不能在定义和声明同时出现, 就会省事很多引用变量的定义: 类型& 引用变量名 = 引用实体int a = 10;int& b = a;第二行代码就定义了一个引用变量b,此时的b就是a的别名(引用)a、b共同代表了10定义一个引用变量时,类型& 引用变量名 = 引用实体类型和引用实体的类型必须保持一致,否则会报错,会丢失数据等。
2025-03-03 19:16:35
608
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人