自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(155)
  • 收藏
  • 关注

原创 并查集的进一步优化

通过路径压缩和按秩合并,我们可以将并查集的查找和合并操作的时间复杂度降低到接近O(1)。这使得并查集在处理大规模数据时更加高效。在实际使用中,我们可以根据具体问题选择合适的优化方法,以提高算法的性能。

2024-04-20 17:41:14 504 6

原创 并查集(Union-Find)

并查集是一种数据结构,主要用于解决一些元素分组的问题。它支持两种操作:查找和合并。查找操作用于判断两个元素是否属于同一组,合并操作用于将两个元素所在的组进行合并。并查集可以用于解决一些经典的算法问题,如最小生成树、网络连通性等。

2024-04-20 17:37:20 502

原创 哈夫曼树(Huffman Tree)

哈夫曼树是一种特殊的二叉树,它是由美国计算机科学家David A.Huffman于1952年提出的。哈夫曼树广泛应用于数据压缩、编码等领域,因为它可以有效地减少数据的存储空间和传输时间。

2024-04-19 16:03:20 2254

原创 树和森林的遍历

森林是m (m>0)棵互不相交的树的集合。后根遍历:若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点。先根遍历:若树非空,先访问根结点,再依次对每棵子树进行先根遍历。若森林为非空,则按如下规则进行遍历:访问森林中第一棵树的根结点。中序遍历森林中第一棵树的根结点的子树森林。树的先根遍历序列与这棵树相应二叉树的先序序列相同。树的后根遍历序列与这棵树相应二叉树的中序序列相同。先序遍历除去第一棵树之后剩余的树构成的森林。中序遍历除去第一棵树之后剩余的树构成的森林。先序遍历第一棵树中根结点的子树森林。

2024-04-19 15:25:51 826

原创 树的存储结构

树是一种递归定义的数据结构。树是n (n>=0)个结点的有限集合,n =0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:1)有且仅有一个特定的称为根的结点。2)当n > 1时,其余结点可分为m (m>0)个互不相交的有限集合T1, T2... Tm,其中每个集合本身又是一棵树,并且称为根结点的子树。

2024-04-18 16:56:43 454

原创 在线索二叉树中找前驱后继

在线索二叉树中,每个节点除了左右子节点指针外,还增加了两个标记位:ltag和rtag。其中,ltag表示左子节点是否为前驱,rtag表示右子节点是否为后继。通过这两个标记位,我们可以方便地找到任意节点的前驱和后继节点。

2024-04-18 11:06:01 3064 2

原创 线索二叉树

二叉树是一种非常重要的数据结构。它是由节点组成的有限集合,每个节点最多有两个子节点,通常被称为左子节点和右子节点。线索二叉树是一种特殊的二叉树,它在原有二叉树的基础上增加了指向前驱和后继的指针,使得对二叉树的操作更加高效。本文将详细介绍线索二叉树的概念、构造方法以及相应的C语言实现代码。

2024-04-18 10:36:14 500

原创 二叉树的层序遍历

层序遍历,也称为广度优先搜索(BFS),是一种树的遍历方法,它从根节点开始,先访问上一层的所有节点,再访问下一层的所有节点。这种遍历方式就像我们阅读一本书一样,从左到右,从上到下。

2024-04-16 15:37:15 345

原创 二叉树的先中后序遍历

什么是遍历呢?遍历:按照某种次序把所有结点都访问一遍先/中/后序遍历:基于树的递归特性确定的次序规则二叉树的递归特性:①要么是个空二叉树②要么就是由“根节点+左子树+右子树”组成的二叉树先序遍历:根左右(NLR) ——先访问根结点,在访问左子树,最后访问右子树中序遍历:左根右(LNR) ——先访问左子树,在访问根结点,左后放稳右子树后序遍历:左右根(LRN) ——先访问左子树,在访问右子树,最后访问根节点例如:先序遍历:AB DECFG。

2024-04-16 14:53:13 551

原创 二叉树的链式存储

二叉树是一种特殊的树形结构,它的每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树有一个特殊的节点,称为根节点,它没有父节点。二叉树中的其他节点分为内部节点和叶子节点。内部节点是指至少有一个子节点的节点,而叶子节点是没有子节点的节点。// 数据域,ElemType可以是任何类型// 左子节点指针// 右子节点指针在这个定义中,BiTNode是一个结构体,包含了数据域data和两个指针域lchild和rchild。BiTree是一个指向`BiTNode`的指针类型,通常用来表示二叉树。

2024-04-14 20:41:21 609

原创 二叉树的链式存储——补充

所以,一个二叉树有n个结点的话,那总共就会有2n个指针域,n个结点的二叉链表共有n+1个空链域。

2024-04-14 20:36:37 222

原创 二叉树的顺序存储结构

定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次存储完全二叉树中的各个结点。几个重要常考的基本操作:1. i的左孩子—2i2. i的右孩子—2i+13. i的父节点—[i/2]4. i所在的层次——[log2(n + 1)]或[log2n]+ 1。

2024-04-14 20:22:35 729

原创 二叉树的定义和基本术语及性质

二叉树是n (n≥0)个结点的有限集合:1或者为空二叉树,即n = 0。2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。

2024-04-13 18:11:57 1220

原创 树的定义、基本术语及性质

树是由节点组成的数据结构,它具有以下特点:1. 节点:存储数据的单元,可以是任何类型的值。2. 边:连接两个节点的线,表示它们之间的父子关系。3. 根:仅有一个根节点,没有父节点,是树的起点。4. 子树:根节点之外的任意节点都可以作为子树的根,形成独立的树。5. 叶子:没有子节点的节点称为叶节点。6. 分支节点:具有一个或多个子节点的节点。以下是错误示例:除了根节点外,任何一个结点都有且仅有一个前驱。

2024-04-13 17:32:56 1630

原创 KMP算法

KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,用于在一个文本串中查找一个模式串。KMP算法的核心思想是利用已经匹配的部分信息,避免在文本串中进行不必要的回溯。KMP算法的时间复杂度为O(m+n),其中m和n分别为文本串和模式串的长度。

2024-04-11 19:54:16 733

原创 朴素模式匹配算法

什么是字符串的模式匹配?字符串模式匹配:在主串中找到与模式串相同的字串,并返回其所在位置。

2024-04-11 10:24:35 399

原创 串的定义和基本操作

串通常通过字符数组来表示。字符数组是固定大小的内存区域,用于存储字符序列。串的结尾由空字符'\0'标记,这是一个非打印字符,用于指示串的结束。上述代码创建了一个字符数组`str`,并将其初始化为包含字符串"Hello, World!"的串,后面紧跟着一个空字符'\0'。

2024-04-10 16:15:30 605

原创 串的存储结构

串其实是一种特殊的线性表,用什么样的存储结构实现线性表就可以类似的用什么样的方法实现串。

2024-04-10 16:05:27 450

原创 栈的应用--括号匹配问题

括号匹配问题要求我们确定给定字符串中的括号是否正确匹配。常见的括号类型包括圆括号 `()`, 方括号 `[]` 和花括号 `{}`。正确的匹配意味着每个开括号都有一个对应的闭括号,并且括号的顺序也是正确的。例如,字符串 `"(a+b)*[c-d]"` 是正确的匹配,而 `"(a+b)*[c-d"` 和 `"[a+b]*(c-d)"` 都不是正确的匹配。通过栈这一数据结构,我们能够优雅地解决括号匹配问题。这个例子展示了栈在处理具有特定顺序要求的问题时的实用性。

2024-04-07 15:54:41 347

原创 双端队列(Deque)的探索

双端队列(Deque)是一种特殊的线性数据结构,它允许我们在两端进行插入和删除操作。这意味着我们可以在队列的前端(头部)和后端(尾部)添加或移除元素。这种灵活性使得双端队列在许多应用场景中非常有用。双端队列是一种功能强大的线性数据结构,允许我们在两端进行插入和删除操作。它可以通过多种方式实现,并在许多实际应用中发挥着重要作用。了解双端队列的概念、实现和应用,可以帮助我们更好地解决实际问题。

2024-04-07 15:37:44 248

原创 队列链式实现

链式存储实现的队列:链队列带头结点:不带头结点:step1:step2:step3: step4: step5: tips:若p是最后一个结点还需要修改表为指针,让它指向头结点。如图:顺序存储———预分配的空间耗尽时队满链式存储———一般不会队满,除非内存不足

2024-04-02 17:09:52 817

原创 队列的顺序实现

每次删除操作成功时,都令tag=O;每次插入操作成功时,都令tag=1;只有删除操作,才可能导致队空只有插入操作,才可能导致队满。队空条件:front==rear && tag ==0。初始化时rear=front=0;队满条件:front==rear && tag==1。初始化时rear=front=0;插入成功size++;删除成功size--;队满条件:size==MaxSize。队空条件size==0;

2024-04-02 16:28:18 302

原创 队列的基本概念

队列可以被视为一种模拟现实世界中排队等待服务的场景的数据结构。在任何时间点,一个队列都可以分为两部分:队头(Front)和队尾(Rear)。新元素总是被添加到队尾,而移除操作则发生在队头。队列是计算机科学中的基础数据结构之一,它提供了一种有序的方式来存储和访问数据。无论是在底层的系统设计中,还是在高级的应用程序开发中,队列都扮演着重要的角色。理解队列的概念和操作对于成为一名优秀的软件工程师来说是至关重要的。

2024-03-31 19:16:46 274

原创 链栈的实现

可以联系到对头结点的“后删“操作。可以联系对头结点的后插操作。

2024-03-31 19:08:39 180

原创 共享栈的基本操作

共享栈是一种数据结构,它允许多个栈共享同一个存储空间,从而提高了内存的使用效率。在实现共享栈时,通常会有两个指针分别指向两个栈的栈顶,其中一个指针指向栈底,另一个指向栈顶。当一个栈进行入栈操作时,如果另一个栈为空,则可以复用其空间。总的来说,共享栈的设计使得在有限的空间内可以实现两个栈的功能,适用于需要节省空间或在某些场景下需要动态调整栈大小的情况。在实现时,需要注意同步两个栈的操作,以避免相互干扰导致数据错误。栈满的条件: top0+ 1 == top1。

2024-03-30 17:14:01 265

原创 顺序栈的实现

define MaxSize 10 //定义栈中元素的最大个数//静态数组存放栈中元素int top;//栈顶指针}SqStack;SqStack S;//声明一个顺序栈(分配空间)// ...后续操作...

2024-03-30 17:04:34 369 1

原创 循环链表的基本操作

【代码】循环链表的基本操作。

2024-03-29 15:42:50 138

原创 双链表的基本操作

判断双链表是否为空(带头结点)

2024-03-29 10:56:23 904

原创 单链表的查找

GetElem(L,i):按位查找操作。获取表l中第i个位置的元素的值。LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。

2024-03-28 17:56:23 421

原创 单链表的插入和删除

可以申请一个新的节点s作为p的后继节点,把p中的数据复制到s中再把插入的数据放到p中完成前插操作。ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。注意:上述代码s->next=p->next与p->next=s不能颠倒。方法1:传入头指针,循环寻找p 的前驱结点。

2024-03-28 17:22:18 1762

原创 单链表的定义

typedef 关键字 --数据类型重命名。typedef

2024-03-28 15:50:37 536

原创 顺序表的查找

LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。注意:C语言中两个结构类型的比较是不能用“==”来进行比较的。

2024-03-28 15:10:58 342

原创 顺序表的基本操作--删除

【代码】顺序表的基本操作--删除。

2024-03-28 14:44:57 192

原创 顺序表的基本操作--插入

Listlnsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。

2024-03-28 11:09:27 183

原创 顺序表的定义

C语言中用了malloc函数来动态申请内存空间,用free函数来动态释放内存空间。malloc函数返回一个指针,需要强制转型为你定义的数据元素类型指针。顺序表的实现--静态分配。顺序表的实现--动态分配。

2024-03-28 10:49:28 245

原创 了解atoi和offsetof

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2023-09-02 20:50:06 306

原创 C语言文件操作入门指南

C语言中使用函数fopen来打开文件。它接受两个参数:文件名和打开模式。常见的打开模式有: "r"(只读打开), "w"(写入打开)、 "a"(追加打开)、 "rb"(二进制只读打开)、 "wb"(二进制写入打开)等。

2023-09-01 22:06:18 334

原创 柔性数组

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。int i;int a[0];//柔性数组成员}type_a;int i;int a[];//柔性数组成员}type_a;

2023-08-31 22:39:14 385

原创 动态内存管理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2023-08-30 22:26:42 453

原创 模拟实现memmove

【代码】模拟实现memmove。

2023-08-29 22:46:19 187

空空如也

空空如也

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

TA关注的人

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