![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 75
杰深入学习计算机
已经入门,继续努力
展开
-
红黑树的介绍
思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?答案:插入红色会可能会影响性质3,而插入黑色必定会影响性质4;影响了性质3容易修改,而影响性质4,难以修改,所以我们要默认插入的结点为红色,在对相应的情况进行调整!原创 2023-07-07 18:12:21 · 158 阅读 · 0 评论 -
平衡搜索二叉树——AVL树
/ 该节点的左孩子 AVLTreeNode < T > * _pRight;// 该节点的右孩子 AVLTreeNode < T > * _pParent;// 该节点的双亲 T _data;int _bf;// 该节点的平衡因子 };验证其为二叉搜索树如果中序遍历可得到一个有序的序列,就说明为二叉搜索树验证其为平衡树每个节点子树高度差的绝对值不超过1(注意节点中如果没有平衡因子)节点的平衡因子是否计算正确。原创 2023-07-07 06:49:59 · 97 阅读 · 0 评论 -
初识哈希表
如何设计一个运算过程简单、运算结果均匀的哈希函数。保证n个记录能够存进去,又使得存储空间尽可能少。哈希只是通过记录的关键字定位该记录,哈希表。哈希既是一种查找技术,也是一种存储技术。如何采取合适的处理冲突方法来解决冲突。ASL的成功与不成功计算法。所以,哈希主要是面向。原创 2023-06-06 21:03:12 · 473 阅读 · 0 评论 -
动态查找表
或者是一棵空树;若它的左子树不空,则左子树上所有结点的值均小于根结点的值;若它的右子树不空,则右子树上所有结点的值均大于根结点的值;它的左、右子树也都分别是二叉排序树。二叉排序树的中序序列是一个有序的序列什么样的二叉排序树是平衡二叉树?结点的平衡因子:该结点的左子树的深度H L 与右子树的深度H R 之差平衡二叉树根结点的左子树和右子树的平衡因子为-1、0或1;根结点的左子树和右子树也都是二叉平衡树。结点的平衡因子=左子树的深度H L - 右子树的深度H R现象:一棵平衡二叉树,结点的。原创 2023-06-06 20:04:07 · 1155 阅读 · 0 评论 -
线性表查找——查找表
线性表存储结构。原创 2023-04-07 20:34:25 · 60 阅读 · 0 评论 -
查找表基本概念与描述
查找又称为检索,就是从一个数据元素集合中找出某种条件的特定数据元素。对于大量的数据,数据元素之间除了有相同的类型,就没有任何关系。如何高效的在这些数据中查找到特定的关键字的数据,是查找边要解决的问题。查找过程中将给定值和关键字进行比较查找的平均次数,或者说给定值与关键字比较次数的期望值。有相同类型的数据元素(或记录)构成的集合,查找表是一种非常灵活的一种数据结构。查找表的记录很多,无法存储到内存中,要将记录存储到硬盘中,对外进行查找。数据元素的某个特定项,用来表示特定元素。对查询的内容进行修改。原创 2023-04-07 19:27:30 · 219 阅读 · 0 评论 -
图知识点总结
思维导图链接图原创 2023-04-06 20:06:51 · 303 阅读 · 0 评论 -
有向无环图及其应用
将弧尾的结点拍在弧头的前面,没有优先关系的都无所谓。顶点是活动,弧表示优先关系。原创 2023-04-06 17:09:24 · 431 阅读 · 0 评论 -
图的最短路径问题
【代码】图的最短路径问题。原创 2023-04-05 21:17:09 · 39 阅读 · 1 评论 -
图的连通性
过程:从一个顶点出发(标记出发点被访问过),选择与它邻接点的边中权值最小的边,将这个边的邻接点标记为被访问过,在以邻接点出发,找到个邻接点的边,比较到该点到个顶点的距离,小的且没被访问过的顶点,则更新距离,在从找到最小的边,往复操作。接着从小到大开始选边,判断边的两个顶点(x,y)是否属于同一个子树中,是的话就跳过这个边,不是的话就添加这个边,并将x所属的子树根结点编号该成y所属的子树根结点编号。当选取边达到n-1的时候,算法结束。最小生成树:在生成树中,边的权值之和最小的生成树。原创 2023-04-04 16:37:39 · 82 阅读 · 0 评论 -
图的遍历算法的应用
如果w已经被访问,从弧头出发的深度优先遍历还没有结束(statew==0),而从弧尾v出发出发的深度优先遍历已经结束(statev=1),则出现了环。(2)由顶点a出发进行深度优先遍历已经完成的顶点(所有的邻接顶点都已经被访问过)一定不是顶点a到顶点i路径上的顶点。:在有向图的深度遍历中,对于弧,如果遍历出现从弧尾v开始的深度优先遍历v开始的深度优先遍历比弧w开始的优先遍历结束的早,则出现了回路。(1)从顶点a出发到顶点i,若存在路径,则从顶点a出发进行深度优先遍历搜索,必能搜索到顶点i。原创 2023-04-04 15:44:07 · 679 阅读 · 0 评论 -
图的遍历算法
从图中某个顶点vi出发,访问此顶点,然后依次从v1的各个未被访问的邻接点出发进行深度优先搜索来遍历图,直至所有与v1所有路径想通的顶点都被访问到为止。对于先访问的顶点,其深度优先遍历后结束;后访问的顶点,其深度优先遍历先结束。所以,深度优先遍历可以用栈的结构来进行非递归遍历。:从图中的某个顶点出发,访问此顶点之后,依次访问v的所有未被访问过的邻接点,之后按这些顶点被访问的先后依次访问它们的邻接结点。关键:是要找进行深度优先遍历的下一个邻接结点的位置。对每一个未被访问过的顶点进行深度(广度)优先遍历。原创 2023-04-04 12:01:38 · 449 阅读 · 0 评论 -
图的数据类型的构建
ADT Graph数据对象:具有相对特性的数据元素的集合,称为顶点集。数据关系:R={VR}边,有意义基本操作:图结构的创建;图结构的销毁;在图中找特定结点;对图中某个结点进行赋值;返回某个结点的邻接结点;添加新的结点;删除某个结点;深度优先遍历图;广度优先遍历;}ADT Graph。原创 2023-04-02 22:11:22 · 340 阅读 · 0 评论 -
图的定义和基本术语
图是由顶点和有穷非空集合和顶点边的集合吗,表示为G=(V,E)。G表示一个图,V是图G的顶点(数据元素)的集合,E是图G中顶点之间边的集合。在图中,顶点个数不能为零,但可以没有边。原创 2023-04-01 21:00:07 · 641 阅读 · 0 评论 -
排序算法汇总
总的来说:选择一个整数gap,将一个序列分成gap个组,所有数据间距为gap进到一个组。然后减小gap的取值,重复上述的操作,当gap等于1的时候,进行直接插入排序。【第二步:将数组的第一个元素看成是一个有序的序列,将剩下的一个一个元素插入这个有序序列中。**主要思想:**将待排序的数据,就一个一个的数据插入到一个有序的序列中,并保持插入之后还是有序的。**希尔排序的底层逻辑:**将较大的值快速的往后移动。【步骤1:对一个有序的组,插入一个数据】gap的取值越小,跳的越慢,序列越有序。原创 2023-03-31 22:19:57 · 352 阅读 · 0 评论 -
哈夫曼树及其应用
因为哈夫曼树的结点是预先知道的,所以可以用一个结构体数组来存储,利用双亲和孩子结点的关系来存结点的位置,即下标表示。(2)在F中找到两棵根结点最小的树作为左右子树构成一棵新的二叉树,且根结点的权值为左右子树根结点的权值之和。(2)只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为1的结点。用让WPL的值最小,需要尽可能的将权值大的靠近根结点,权值小的远离根结点。(1)权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。(3)结点带权路径:结点上权值与该结点到根之间的路径长度的乘积。原创 2023-03-27 16:47:53 · 519 阅读 · 0 评论 -
树、森林与二叉树的转换以及其应用
如果找到的双亲接单的第一个孩子结点地址为空,则双亲结点没有孩子,新插入孩子结点作为第一个孩子结点;删除树中的一个结点,约定将删除以该结点为根的子树,如果该结点是双亲的第一个孩子,需将它的右兄弟链接为双亲的第一个孩子;为了确保删除的子树是正确的,一定要将被删除结点的右兄弟置空之后,再删除以该结点为根的子树。(3)树的兄弟关系对应的是二叉树的双亲和右孩子关系,即从第2个孩子开始,依次是前一个孩子结点的右孩子。(2)树的双亲和长子关系对应二叉树的双亲和左孩子的关系,即树的第一个孩子是二叉树的左孩子。原创 2023-03-25 22:49:07 · 1035 阅读 · 0 评论 -
线索二叉树结构
在某种顺序遍历二叉树的时候,存在直接前驱结点和后继结点的信息,对于非空指针域指向原本的左右孩子,而对于非空指针域来说,左孩子指针指向遍历序列的直接前驱结点,右孩子指向遍历序列的直接后继结点。这种指针称为线索,加了线索的二叉树称为线索二叉树。原创 2023-03-25 10:28:58 · 346 阅读 · 0 评论 -
二叉树结构的实现
二叉树结构原创 2023-03-24 11:57:44 · 565 阅读 · 0 评论 -
二叉树的运用——堆的结构
堆是完全二叉树的一种,子树的根结点比孩子都大称为大根堆,比孩子都小称为小根堆;原创 2023-03-22 07:40:51 · 156 阅读 · 0 评论 -
二叉树的基本概念以及性质
二叉树是由一个根结点和两棵称为左子树和右子树的二叉树构成,有左右的顺序之分。所以三个结点的树只有两种结构,而三种结点的二叉树有五种结构。原创 2023-03-20 19:44:10 · 350 阅读 · 0 评论 -
树基本概念
树是根和子树构成的一对多的多层次结构。所以树是一种递归的定义。原创 2023-03-20 16:59:24 · 242 阅读 · 0 评论 -
栈与队列的互相模拟和循环队列
栈是后进先出的,队列是先进先出的。要想实现栈,就需要将最后进队列的元素先出,则只需要一个队列为空,一个队列用来接受元素。当要进栈的时候,要将元素插入到一个非空的队列中,保持另一个是空队列;当要出栈的时候,将非空队列的元素逐步出到另一个空队列中,当非空队列只有一个元素的时候,将此时的元素出队列,并且不在入另一个队列,此时的元素就是出栈的元素。【相关函数的实现】原创 2023-03-20 08:59:04 · 83 阅读 · 0 评论 -
数据结构——第4章 数组与广义表(2)
比如,只存储下三角中的元素aij,其特点是j原创 2023-03-14 17:37:49 · 309 阅读 · 0 评论 -
数据结构——第4章 数组与广义表(1)
比如,一维数组可以看作线性表,二维数组可以看作“数据元素是线性表”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推,因此数组可以看作线性表的扩展。以C语言为例,二维数组的内存分配原则是“以行为主序”,每一行是一个一维数组,所有行首尾相连也是一个一维数组,因为内存的地址空间是一维的,数组的行列固定后,通过一个映像函数,即可根据数组元素的下标得到它的存储地址。数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识,因此,在数组不适合做插入、删除数据元素的操作。原创 2023-03-07 16:35:33 · 362 阅读 · 0 评论 -
链表面试题
解题思路:根据回文结构关于中间结点的对称,那我们可以先找到中间结点,在将中间结点后面的结点逆序,最后将逆序后的结点和前面的结点进行比较,当存在一个不相等的时候,直接返回FALSE,循环结束则返回TRUE。:用两个指针,来遍历整个链表,当出现cur指向的结点和val的值相等就,就将pre指向的结点指向cur的下一个结点,在free掉cur的结点。解题思路:用快慢指针来解决,先让快指针先走k步,在让慢指针开始走,当快指针走完的时候,慢指针的位置就是倒数第K个结点。解题思路:两个链表比较,小的尾插到新的结点里。原创 2023-03-05 21:45:49 · 298 阅读 · 0 评论 -
数据结构——第三章 栈与队列(5)
循环队列一定要哦保证一片连续存储空间的循环使用,因此循环队列的类型考虑给定的数据成员能否正确表达队头、队尾的位置以及队空、队满的条件和队列元素个数的计算。这样的结构常用于计算机的CPU的调度,所谓“CPU调度”是指在多人使用一个CPU的情况下,由于CPU在同一时间只能执行一项任务,所以将每个人的工作任务事先存放在队列中,待CPU闲置时,再从队列中取出一项待执行的工作进行处理。双端队列与共用栈是不相同的。假设两个栈共享一维数组s[MAXNUM],其中一个栈的栈顶用topl指示,另一个栈的栈顶用top2指示。原创 2023-03-05 10:26:02 · 541 阅读 · 0 评论 -
数据结构——第三章 栈与队列(4)
现在A1中已经有了2个项目,后来入选的项目必须与A1中的2个项目都没有冲突,为此将冲突表中与刚入选的项目2对应的行按下标与case数组相加,用两者的和更新case数组,此时的case数组是后续待选项目能否入选的依据。现在A1中已经有4个项目,后来的项目必须与A1中的4个项目都没有冲突,为此将冲突表中与刚入选的项目7对应的行按下标与case数组相加,用两者的和更新case数组,此时的case数组后续待选项能否入选的依据。当前是1,表明6与子集A1中的已有项目冲突,项目6不能加入子集A1,出队后直接入队。原创 2023-03-04 23:13:06 · 391 阅读 · 0 评论 -
数据结构——第三章 栈与队列(3)
队列也是一种特殊的线性表,限定插入操作在线性表的一端进行,删除操作则在线性表的另一端,它具有先进先出的特点。队头(front):允许删除的一端。队尾(rear):允许插入的一端。队列在实际应用中非常广泛,例如:(1)解决由多用户(多终端)引起的资源竞争问题。在分时操作系统中,多个用户程序排成队列,分时地循环使用CPU和主机。当队头的用户给定时间片内未完成工作时,它就要放弃使用CPU,从队列中撤出,重新拍到队尾,等待下一轮的分配。(2)解决主机与外部设备之间的速度不匹配问题。原创 2023-03-04 15:15:22 · 401 阅读 · 0 评论 -
数据结构——第三章 栈与队列(2)
后缀表达式中的运算规则是连续出现两个操作数和在它们之后紧靠它们的运算符构成一个最小的表达式,由于运算符的顺序与计算机顺序一致,因此只需一次扫描后缀式,即可完成表达式的计算,效率高。若是运算符,则连续出栈两次,第一出栈的元素是第二个操作数,第二次出栈的元素是第一个操作数,根据当前的运算符做相应的运算,并将结果进栈,直到‘#’为止。(3)如果算术表达式的当前运算符是’#‘,则依次弹出运算符栈的运算符,同时从操作数连续弹出两个操作数做相应的操作,并将计算结果进操作数栈,直至栈顶的运算符为’#',算法结束。原创 2023-03-03 23:11:08 · 432 阅读 · 0 评论 -
数据结构——第三章 栈与队列(1)
栈的是一种特殊的线性表,限定插入和删除操作只能在一端进行,具有后进先出的特点。其中栈顶是允许插入和删除的一端;栈顶则是不允许插入和删除的一端。入栈push出栈pop栈的抽象数据类型描述如下。数据对象数据关系:R={|ai-1,ai∈D,i=2,……,n},约定an端为栈顶,a1端为栈底基本操作初始化操作:InitStack(&S);销毁栈结构:DestroyEmpty(S);判断栈是否为空:StackEmpty(S);获取栈顶:GetTop(S,&e);原创 2023-03-01 23:26:43 · 88 阅读 · 0 评论 -
数据结构——第二章 线性表(8)——线性表总结
第二种在类型中给出的是存放一维数组首地址的指针成员,数组的大小由初始化操作完成,大大提高了该类型的实用性。基于这两种存储结构的基本操作实现,需根据每个基本操作是否改变了存储结构中的成员值以及需要的其他条件,正确定义函数的形参。如果数据元素的类型是简单类型,则顺序表类型的自定义只需一步,直接定义顺序表结构体类型即可。如果数据元素的类型是结构体类型是结构体类型,则顺序表类型的自定可分两步完成。如果数据元素的类型是简单类型,链表类型的自定义只需一步,直接定义结点类型和指向结点的指针类型即可。原创 2023-02-25 22:25:40 · 534 阅读 · 0 评论 -
数据结构——第二章 线性表(7)——字符串匹配算法
字符串是文档操作最主要的文字对象。目前所有的文档处理软件都提供了强大的字符串处理功能,特别是查找功能,它是插入、删除、复制、粘贴以及替换等操作的先行操作,因此文档处理效率的关键。本节重点讲述字符串匹配算法,即在一个字符串中查找另一个字符串首次出现的位置。由于字符串中的字符序列具有线性结构的特点,因此字符本质是一个线性表,而字符串匹配算法可以看作是基于线性表的查找操作。简单起见,以下涉及的操作均在顺序存储的字符串上完成。原创 2023-02-25 21:57:02 · 517 阅读 · 0 评论 -
数据结构——第二章 线性表(6)——线性表的应用
为了在La中寻找插入位置,需设两个工作指针pa和qa,它们指向的结点关系满足< * qa, *pa>,将需要插进来的结点 * pb与 * pa进行比较,如果满足pb->data data,则将 * pb 插入到 * qa 和 * pa之间;方法二:假设合并的链表上的结点空间是重新申请的空间,其算法设计的主要思想是将原来的两个链表上的结点依次比较并逐个插入到新链表中。方法1:假设合并的链表上的结点空间是原来的空间,其算法设计的主要思想是将其中一个链表的结点逐个插入到另一链表中。原创 2023-02-24 21:01:41 · 405 阅读 · 0 评论 -
数据结构——第二章 线性表(5)——双向循环链表
单向链表便于查询后继结点,不便于查询前驱结点。为了方便两个方向的查询,可以在结点中设两个指针域,一个存放直接前驱结点的地址,另一个存放直接后继结点的地址。双向循环链表的数据类型描述如下。//存放前驱结点的地址//存放后继结点的地址。原创 2023-02-24 19:41:17 · 593 阅读 · 0 评论 -
数据结构——第二章 线性表(4)——单向循环链表
单向链表中的最后一个节点指针域为空,如果查找当前位置的前驱结点,必须回到链表头,重新扫描。如果用最后一个结点的指针域记住头结点,则链表上的结点可以循环使用,这种链表称为单向循环链表。常用的单向循环链表有两种:一种是带头指针的单向循环链表,另一种是带尾指针的循环链表。带头指针和头结点的单向循环链表中L记的是头结点,尾结点的指针域记的也是头结点,尾结点必须通过循环才能找到。判断链表是否为空的条件是L->next==L为真。原创 2023-02-23 22:17:54 · 463 阅读 · 0 评论 -
数据结构——第二章 线性表(3)——顺序结构与链式存储结构对比
链式存储中的结点除了存放数据元素的空间以外,还有一个指针变量。顺序存储中的每一个元素的空间是按实际类型分配的,没有额外的空间,即顺序存储密度=1,而链式存储密度原创 2023-02-21 16:54:46 · 231 阅读 · 0 评论 -
数据结构——第二章 线性表(2)——链式存储结构
由于单向链表每个结点的指针域记得是直接后继结点,所以要想使插进入的新结点* s成为第i个结点,即让 *s的指针域记原来ai所在结点的地址,并让原来a-i所在结点的指针域记 * s的地址,实现这些操作的前提是找到ai-1所在结点的指针域记 *的地址,实现这些操作的前提是找到ai-1所在的第i-1个结点。所谓的就地逆置指的是,原来的一组数据已经存放在一个带头结点的单向链表中,现在将这组数据逆序存放,结点的存储空间数原来的,只是改变了结点的指向。方法一:将建立的带结点的头指针存到主调函数的某个头指针变量H。原创 2023-02-20 22:31:41 · 654 阅读 · 0 评论 -
数据结构——第二章 线性表(1)——顺序结构
线性表是最简单的一种线性结构,具有如下特征。(1)线性表中必存在唯一的一个“第一元素”。(2)线性表中必须存在唯一的一个“最后元素”。(3)除了最后元素之外,其余元素均有唯一的直接后继。(4)除了第一个元素之外,其余元素均有唯一的直接前驱。线性表的抽象数据类型定义形式:ADT List{ 数据对象:{ n为线性表的表长,即数据元素的个数;n=0时的线性表为空表。数据关系:{ 设线性表为(a1,a2,…,ai,…原创 2023-02-16 20:48:12 · 710 阅读 · 0 评论 -
数据结构——初识数据结构——第1章 绪论(1)
为此,仅有数据的逻辑结构是不够的,还必须研究这些结构在计算机内的存储方式,即存储结构,也称为物理结构。从“数学抽象”的角度看,可称它是一个已经用某种语言实现了的“抽象数据类型”,它强调的是其本质特征、它所能完成的功能以及它与外部用户的接口(即外界使用它的方法)。寻求数学模型实质就是分析问题,从中提取操作的数据对象,并找出数据对象中的数据元素之间蕴含的关系,并加以描述。数据结构:为了设计出高效的程序,需要对计算机程序加工的数据对象进行系统的研究,即研究数据的特性以及数据之间存在的关系,此即数据结构。原创 2023-02-13 23:15:46 · 361 阅读 · 0 评论