
数据结构篇
文章平均质量分 88
酒竹.
这个作者很懒,什么都没留下…
展开
-
c++红黑树的模拟实现
enum ColorRED,BLACKpublic:RBTreeNode(const pair& kv,const Color& color=RED)//颜色的缺省参数给定为红色:_kv(kv)private:其他的我们都能理解,但是颜色的缺省参数为什么给定红色呢?我们想一想,根据红黑树的几条性质,我们插入的时候要怎么检测呢?难道每插入一个都检查一下树的每条路径黑色节点个数是否相同吗?当然不是,插入时我们只需要检测是否有连续的红色节点。原创 2024-05-12 20:13:36 · 1311 阅读 · 0 评论 -
c++AVL树的模拟实现
AVL与红黑树中存放的数据都是pair结构。//左孩子//右孩子//父亲int _bf;//平衡因子,健康的平衡因子绝对值不大于1:_bf(0),_kv(kv){}这里可以看到,AVL树的节点与平衡二叉树的节点区别在于AVL树节点有一个平衡因子的存在,也即1.1概念中所述。同时AVL树采用了三叉链结构,好处在于在对树进行操作时,不必额外存储节点的父亲。假如以pParent为根的子树不平衡,即pParent的平衡因子为2或者-2,分以下情况考虑。原创 2024-05-11 17:07:26 · 1335 阅读 · 1 评论 -
六大排序精解
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。数据元素全部放在内存中的排序。数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。原创 2024-03-21 14:23:50 · 975 阅读 · 0 评论 -
二叉树之堆的应用
所谓堆排序,即是使用堆的思想来进行排序。在堆中,我们逻辑上想象他是一棵树,但实际在物理上它是一个数组。原创 2023-12-29 15:13:04 · 1852 阅读 · 1 评论 -
数据结构之树 --- 二叉树
定义链式二叉树同定义链表相同,只是需要注意二叉树有两个指针,类似于双向链表,逻辑上我们将其看作一棵二叉树。下面是定义该树的结构体。}BTNode;在创建二叉树之前,我们需要了解前序、中序、后序以及层序遍历。原创 2023-12-27 19:29:31 · 983 阅读 · 0 评论 -
数据结构之树 --- 二叉树 < 堆 >
/size是元素个数,所以最后一个元素的下标为size-1//以最后一个元素为始//求其父节点while (child > 0)//孩子节点存在if (hp->a[child] < hp->a[parent])//如果父节点大于子节点,则交换,并更新父子结点elsebreak;原创 2023-12-26 20:27:50 · 1197 阅读 · 1 评论 -
揭开线性表的神秘面纱 —— 栈与队列
我们定义的top指向栈顶元素的下一个,因此top实际上等同于元素个数。首先我们看看队列的结构定义:由于我们借由单链表实现队列,所以需要结构体的嵌套,队列的实现是基于单链表的结构,而后使用两个指针的操作达成队列的特性。原创 2023-11-24 18:13:31 · 89 阅读 · 1 评论 -
揭开线性表的神秘面纱——双向链表
在单链表那篇文章中我们使用c语言实现了无头单向非循环链表,本文将实现带头双向循环链表,在诸多链表结构中,上述两种链表在实际生活与面试题中最为常见。1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单。原创 2023-11-19 19:57:57 · 172 阅读 · 1 评论 -
揭开线性表的神秘面纱 —— 单链表
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。例如:由于链表的物理地址不连续的特殊性,我们在堆上malloc出节点用来存放链表数据,以单向链表为例,malloc出的节点包含数据域与指针域。如下图所示的箭头指向是我们想象出来的,由于malloc申请空间是随机申请,所以节点的地址也是杂乱无章的,但在逻辑上我们想象他们是一条链子。原创 2023-11-19 17:53:44 · 59 阅读 · 0 评论 -
链表题解之反转链表
将cur,newhead,Next经过图中代码操作,将newhead赋给cur->next,更新newhead与cur,位置更换。直到cur为NULL时,newhead为5元素所在节点。此时newhead为链表的头节点,返回newhead。这一方法较之更改指向更为简单, 只需保存当前节点cur的下一节点,随后使用头插法将cur节点插入newhead中,最后返回newhead。由于我们要更改单链表的指向,为了方便起见我们定义三个指针,cur,newhead,Next。,请你反转链表,并返回反转后的链表。原创 2023-11-15 20:39:18 · 54 阅读 · 0 评论 -
揭开线性表的神秘面纱 —— 顺序表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。原创 2023-11-13 22:02:56 · 174 阅读 · 0 评论 -
链表题解之环形链表Ⅱ
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。给定一个链表的头节点。如果链表无环,则返回。,则在该链表中没有环。原创 2023-11-11 21:36:39 · 134 阅读 · 1 评论 -
链表题解之环形链表Ⅰ与相交链表
根据题意与单链表特性可知,有环无空,设cur为当前节点,即如果cur或cur->next==NULL,则链表无环。根据链表特性,每个节点的指针域只能存一个地址,因此两个链表形成的结构只能是如上图所示的Y字形。自起始节点之后,两个链表内容相同,可看作一个链表。判断两个链表是否存在相交节点,存在返回起始相交节点,不存在返回NULL。即如果两个链表的尾节点相同,则两个链表必然相交,如果不同,必然不相交。// 两链表同时走,第一个相同节点即为起始相交节点。,函数返回结果后,链表必须。,判断链表中是否有环。原创 2023-11-11 20:42:10 · 67 阅读 · 1 评论