- 博客(99)
- 收藏
- 关注
原创 红黑树C语言代码实现
通过对红黑树的左旋、右旋、变色操作,以及前驱节点和后继节点的查找,我们能够维护红黑树的平衡性,确保其高效的查找、插入和删除操作。本文详细介绍了这些辅助操作的实现代码,为深入理解红黑树提供了基础。红黑树通过在插入和删除节点后进行必要的旋转和变色操作,确保树的高度始终保持平衡,从而保证高效的查找、插入和删除操作。本文详细讲解了红黑树的插入操作及其调整机制,通过具体代码展示了实现过程。理解红黑树的这些基本操作对于掌握高级数据结构和算法具有重要意义。红黑树的删除操作比插入操作复杂得多,需要考虑多种情况。
2024-07-23 15:43:10
1042
原创 考研数据结构学习方法经验贴
🤠当一轮学习完成之后,第二轮就需要将第一轮做错的选择题再做一遍,并且将代码题综合题硬着头皮去做,不要有畏难情绪,大家都是这么过来的,当然学长这里不建议只写伪代码,看似好像初试又不上机,伪代码就足够了,实则不然,伪代码有着天然的不足,很多同学都会陷入一个窘境,那就是根本不知道自己写的伪代码到底对不对,没有人能够告诉他,而且很大可能是错的,自己却误以为是对的。这样的情况对于我们的学习是极其不利的,应极力避免。而自命题不同,命题及其不确定,难度普遍偏大,体现在代码题的题量上,所以自命题的备考应重视代码题的训练。
2023-05-13 16:06:00
1330
1
原创 考研数据结构百题狂练
该系列视频收录130道考研编程题,覆盖王道所有课后代码题,精选部分李春葆、严蔚敏数据结构课后题,且手把手带你敲出每一行代码,分析题目思路,总结题目规律,应对考研期末绰绰有余。完整课程 CCTalk 搜索:北街学长 或添加QQ:973086561
2023-02-01 09:51:31
395
原创 分别采用深度优先遍历和广度优先遍历判断是否存在由vi到vj的路径,图用邻接表存储
分析: 采用深度优先:我们从vi顶点开始进行深度遍历,若若存在路径则必然可以走到vj顶点处; 采用广度优先:同样从vi顶点开始进行广度遍历,若存在则必然可以走到vj顶点处。...
2021-06-11 10:26:14
2931
3
原创 从文件中读取数据以创建图
背景:之前一直在控制台输入有关图所需的数据,可控制台极易输错,且要想达到好的测试效果,那么就需要大量数据,显然控制台输入太慢且费时,所以思考利用文件读取的方式。
2021-06-07 22:00:24
3118
3
原创 广度优先遍历
题目:对采用邻接表存储的图进行广度优先遍历分析:我们知道邻接表上的顶点所连接的节点都是它的相邻节点,而对于广度优先遍历来说,类似于层次遍历,就是要把所有的邻接点进行访问, 所以我们需要从第一个节点开始访问它的所有邻接点,还有需要注意的是,当我们把邻接点访问后,需要依次访问邻接点的邻接点,这就需要 用队列将我们访问过得邻接点入队,这和层次遍历一样,也只有这样,我们才能访问所有的节点。当然,在这个过程中,会有重复访问的情况, 所以我们需要用一个数...
2021-06-07 10:37:32
281
原创 车辆轮渡管理
题目:汽车轮渡,要求:每次10辆,客车优先于货车,每上4辆客车才能上1辆货车,客车不足4辆时,货车代替货车不足时,允许客车都上。分析:这仍然是一类排序的问题,王道书上的解答可以,核心意思就是客车和货车分为两个队列,客车队列出4辆,紧接着货车队列出一辆;当出现客车不足时,出货车队列代替,当货车不足时,继续出客车队列。代码也不难实现。 这里我想分享一下自己的想法,我们上一题做过货车车厢调整的算法,利用栈将软座调整到硬座的前面,这里我们可以仿造相当于我们要将客车调整到货车的前面,只是有限制...
2021-06-05 20:22:32
510
原创 利用栈实现递归函数的非递归计算
题目:利用栈实现以下递归函数的非递归计算分析: 这里我们需要使用栈的先进后出特性。我们可以看出,从n=2开始,每一个值便都与前两个值挂钩,且式子不变,我们可以从栈顶到栈底依次边出栈边计算,直至栈底,便可以得出最终结果。代码如下:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>struct Recursion { int no; int val;...
2021-06-05 20:18:44
3154
3
原创 车厢调度
题目:利用栈进行车厢调度,使软座全部位于硬座前面分析: 原文题目较长,但仔细分析后,这道题是一类较为简单的题。这里其实也并不需要用到栈的先入后出的特性,仅仅需要将硬座暂存,让软座先出去而已,所以将栈换成其他结构也是可以的,只要能够暂存数据。但这里题目要求用栈。 为了模拟列车座位,我们采用两个数组来存储,数组A为入口处火车,数组B为出口处火车,A内数据依次入栈,若为硬座则压入栈,若为软座则直接进入B,最后栈内元素全部出栈,入B,至此,完成要求。代码如下:#in...
2021-06-05 20:00:42
521
原创 邻接表存储图☆
采用邻接表的方式存储图 分析: 采用邻接表相对于邻接矩阵来说更节省存储空间,这里我们需要两个数据结构: ①顶点表结构:包括顶点信息及指向第一个邻接点的头指针 ②边表结构:包括该邻接点域(在数组中的下标)、权值及下一个邻接点指针 ③一个数组,用于存储所有顶点,因为数组的随机存储特性,方便我们查找 ④图结构:包括顶点数组及顶点数、边数 具体创建流程: 首先我们需要输入图的顶点...
2021-04-11 18:12:14
1344
原创 使用邻接矩阵存储图
使用邻接矩阵构造图 分析: 其实图相比于其它数据结构较复杂,但也是十分易懂的,对于使用邻接矩阵存储的图来说,我们所需要知道的数据有 图的定点数、边数、用一个二维数组存储的边与边的联系及其权值,未连接的边我们要使用无穷表示,节点自身用0 表示,初始时除自身节点外均表示为无穷。另外我们还需要一个一维数组用来存储我们的顶点个数代码如下:读者可以自行测试#define MAXSIZE 100 //数组最大值typedef struct Grap...
2021-04-10 16:24:37
1487
原创 判断是否是平衡二叉树
利用二叉树遍历的思想编写一个判断二叉树是否是二叉平衡树的算法 分析: 我们可以采取后序遍历来完成该算法,因为后序遍历不会含有重复计算。 我们对每一个节点进行判断,如果左右子树均平衡且左右子树高度差小于等于1,则该节点平衡代码如下:struct Tree { int data; Tree *left, *right;};#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#includ...
2021-04-09 14:40:31
1121
原创 求出给定节点在二叉排序树中的层次
题目:设计一个算法,求出指定节点在给定二叉排序树中的层次 分析: 我们可以根据二叉排序树的性质,从根节点一直向下查找,每查找一次,层次便加一typedef struct node { int data; node *left, *right;}Tree;#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>Tree *create(Tree *T) {/...
2021-04-08 14:55:09
4743
原创 判断一颗二叉树是否是二叉排序树
题目:编写一个算法判断给定的二叉树是否是二叉排序树分析: 二叉排序树的中序序列是升序序列,我们可以根据这一特性来进行判定typedef struct node { int data; node *left, *right;}Tree;#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>Tree *create(Tree *T) {//先序创建一颗二叉树 i...
2021-04-08 14:33:31
2902
原创 以孩子兄弟链表为存储结构,请设计递归算法求树的高度
题目:以孩子兄弟链表为存储结构,请设计递归算法求树的高度分析:如果只有根节点,那么高度为1,如果有左孩子,那么高度由左孩子的左子树和右子树决定,取其大者。代码如下:typedef struct node { char data; node *fch, *nsib;}Tree;#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>Tree *create(Tree *T)
2021-04-01 14:39:32
4312
5
原创 编程求以孩子兄弟表示法存储的森林的叶子结点数☆
题目:编程求以孩子兄弟表示法存储的森林的叶子结点数分析:我们可以试想一个节点它如果有左孩子,那么根据孩子兄弟表示法的规则,那它一定不是叶节点,相反如果没有左孩子,那么 它一定是叶子结点,其右孩子即它的兄弟,同样应该这样去判断。代码如下:typedef struct node { char data; node *fch, *nsib;}Tree;#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>...
2021-04-01 13:57:53
2025
1
原创 将表达式树转换成中缀表达式☆
题目:请设计一个算法,将给定的表达式树,转换成等价的中缀表达式并输出。分析: 题目已然说明我们要采取中序遍历,进而输出该表达式,那么需要注意的点便是我们的括号在哪里加,其中根节点处(也就是整个式子不需要包裹一层)和叶子结点 处(也就是操作数)不需要添加括号,其余情况在访问左子树前加左括号,访问右子树后添加右括号。代码:struct BTree { char data; struct BTree *left, *right;};#define _CRT_SE...
2021-04-01 10:53:36
2238
3
原创 求叶节点带权路径长度之和
题目:二叉树的带权路径长度(WPL)是二叉树中所有叶节点的带权路径长度之和。给定一颗二叉树T,采用二叉链表存储,节点结构为 left weight right 试设计求T的WPL的算法分析: 我们求带权路径长度,既需要知道叶节点的权值,也需要知道其经过的路径,我们可以设置一个变量depth代表深度,也就是 路径长度,设置一个静态变量weight累加带权路径,会使用到递归。代码如下:struct tree { int w...
2021-03-31 15:44:36
1184
2
原创 通过中序线索二叉树找某节点的后续前驱☆
题目:写出在中序线索二叉树里查找指定节点在后序的前驱结点的算法分析: 在后序序列中,若节点p有右子女,则右子女是其前驱,若无右子女而有左子女,则左子女是其前驱。若节点p左右子女均无, 设其中序左线索指向某祖先节点f(p是f右子树中按中序遍历的第一个节点),若f有左子女,则其左子女是节点p在后序中的前驱; 若f无左子女,则顺其前驱找双亲的双亲,一直找到双亲有左子女(此时左子女是p的前驱)。还有一种情况,若p是中序遍历的第 一个节点,则节点p在中...
2021-03-31 15:08:49
1195
原创 判断两棵树是否相似
题目:试设计判断两课二叉树是否相似的算法。所谓二叉树T1和T2相似,指的是T1和T2都是空的二叉树或只有一个根节点;或二者左子树相似 且左子树相似分析: 典型的要采取递归来处理代码:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};#include <stdlib.h>#include <stdio.h>bool isSi...
2021-03-31 10:42:59
1438
原创 将叶节点连接成一个链表☆
题目:设计一个算法将二叉树的叶节点按从左到右的顺序连成一个单链表,表头指针为head。二叉树按二叉链表方式存储,连接时用叶节点的 右指针来存放单链表指针。分析: 我们要将叶节点连起来,那么我们首先要按从左至右的顺序找出叶节点,要满足这样的出场顺序,可以采用先序,中序,后序, 这里我们采用中序遍历。代码:struct biTree { char data; struct biTree *lchild; struct biTree *rch...
2021-03-30 14:38:51
794
原创 已知满二叉树的先序序列,求其后序序列
题目:设有一颗满二叉树(所有节点值均不同),已知其先序序列为pre,设计一个算法求其后序序列post分析: 题目已经告诉我们是一颗满二叉树,那我们就可以从先序序列推出后序序列,因为满二叉树总是对半分的,具体操作: 1、找出先序序列的根节点,将其放入后序序列数组末尾; 2、将根节点之后的节点分成左右两堆,在分别执行上一步 3、直至全部处理完代码如下:#include <stdio.h>void preToPost(ch...
2021-03-29 10:49:01
2277
1
原创 求二叉树的宽度
假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树的宽度(即具有节点数最多的那一层的节点个数) 分析: 这道题和求高度那道题大同小异。我们仍然可以采取层次遍历,统计每一层的节点个数,找到宽度最大的那一层。代码如下:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};struct LinkQueue {//上次求高度采用的是顺序队列,这次采用链式队列,雨露均沾哈...
2021-03-28 14:37:41
1838
原创 二叉链表之寻找两节点的最近公共祖先☆
题目:p、q分别为指向该二叉树中任意两个节点的指针,试编写算法ancestor(root,p,q,r),找到p、q的最近公共祖先节点r分析: 上一道题其实可以给我们一些启示,就是我们可以将任意节点的祖先存起来,那这里我们也可以用两个栈,分别将p、q 的祖先存在栈中,因为栈顶是最近的祖先节点,所以我们可以一次往下寻找相同节点,第一次找到的相同节点便是最近公共 祖先节点。代码如下:struct biTree { char data; struct ...
2021-03-27 15:38:19
1055
原创 查找某节点的所有祖先☆
题目:在二叉树中查找值为x的节点,试编写算法打印值为x的节点的所有祖先,假设x的值不多于一个。分析: 这里我们采用后序遍历(非递归),因为在我们遇到x之前我们会把它的祖先节点全部入栈,当我们找到x时,再依次取出栈中元素代码如下:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};struct Stack { biTree *arr; int len; int top;}...
2021-03-27 14:06:44
1070
原创 删除以x为根节点的子树并释放☆
题目:已知二叉树以二叉链表存储,编写算法完成:对于树中每一个元素值为x的结点,删除以它为根的子树,并释放相应的空间分析: 因为我们要删除以寻找到的元素为根的子树,所以我们删除时应采用递归后序遍历进行删除释放,寻找x采用先序遍历,也可以采用其他遍历方式。代码:注意,我经常犯的错误便是指向空,应时刻注意判断是否有孩子结点,然后在进行操作struct biTree { char data; struct biTree *lchild; struct biTree *rchild;...
2021-03-27 11:05:05
2114
3
原创 寻找先序遍历中第k个节点
题目:假设二叉树是用二叉链表存储,试设计一个算法,求先序遍历中第k(1<=k<=二叉树的节点个数)个节点的值分析: 很简单,每遍历一个节点,计数器便加一,直至等于kstruct biTree { char data; struct biTree *lchild; struct biTree *rchild;};#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib....
2021-03-26 16:21:31
1736
原创 交换二叉树的每个节点的左右子树
题目:试编写一个算法将一颗二叉树的所有节点的左右子树进行交换。分析: 我们仍然可以采用递归的方式进行交换。代码如下:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};#include <stdio.h>#include <stdlib.h>void swapTree(biTree *T) {//其本质就是从叶子节点开始进行交换,一路推进到根节点...
2021-03-26 15:20:19
7604
27
原创 统计双分支节点个数
题目:假设二叉树采取二叉链表存储结构存储,试设计一个算法,计算一颗给定的二叉树所有的双分支节点个数分析: 其实二叉树各类操作都十分适合递归,这里我们同样可以采取递归的做法来进行统计双分支节点的个数。具体做法,我们 最开始便定义一个静态变量,递归出口既是无左右孩子。代码如下:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};#include <stdio...
2021-03-26 14:53:15
2222
原创 判断一棵树是否是一颗完全二叉树☆
题目:一颗二叉树以二叉链表的形式存储,编写一个算法判断其是否是一个完全二叉树分析: 我们仍然可以借助队列来完成这件事,具体做法为:我们依次将二叉树从上到下,从左到右入栈,包括空节点,如遇空节点, 若队列非空,则判断其后是否还存在节点,若有,则该树为非完全二叉树。代码:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};struct Squeue { biTr...
2021-03-26 14:36:02
211
原创 根据中序和先序遍历创建一颗二叉树☆
题目:设一个二叉树各节点的值互不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A、B中,试编写算法建立该二叉树的二叉链表分析: 这是一个典型的已知中序和先序求二叉树的案例,具体实现步骤如下: 1、先根据先序序列确定树的根节点 2、根据根节点在中序在中序序列中划分出二叉树的左右子树包含哪些节点,然后根据左右子树节点在先序序列中的次序确定子树的 的根节点,即回到步骤一。 如此重复,直到每科子树仅有一个节点为止。代码如下...
2021-03-26 13:45:44
780
原创 非递归求二叉树高度
题目:假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度 分析: 若要采用非递归的方式来求得二叉树的高度,我们采用层次遍历是最合适的,因为这一层一层的不就很好数吗哈哈。具体实现: 这里唯一的难点就在于我们如何得知高度该加一了;我们可以设置一个标志num用来记录每一层入栈的节点个数,当我们出栈数 达到该数值时也就意味着我们的高度该加一了。代码struct biTree { char data; struct biTr...
2021-03-26 10:29:35
2925
原创 自下而上、从右往左层次遍历
试给出二叉树的自下而上、从右到左的层次遍历算法 分析: 我们只需要在层次遍历的基础上加入栈的使用,我们每次出队后的数据将其入栈,队列空了时,再去依次访问栈中元素,即可达到要求代码如下:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};struct Squeue { biTree *arr; int front, rear;};struct Stack { bi...
2021-03-25 19:37:13
765
原创 二叉树层序遍历
试写出层次遍历的算法 分析: 正如名字所表现的那样,要一层一层的遍历,这里我们就需要用到队列这种数据结构了,具体做法是: 先将根节点入队,然后根节点出队,并依次将根节点的左孩子、右孩子入队。后续如此循环,直至队空代码如下:struct biTree { char data; struct biTree *lchild; struct biTree *rchild;};struct Squeue { biTree *arr; int front,...
2021-03-25 19:07:19
192
1
原创 后序遍历(非递归)☆
试写出非递归的后序遍历算法 分析: 非递归的后续遍历较中序和先序而言,稍微复杂一点,首先我们需要一直从根节点往下寻找左孩子并入栈,之后访问栈顶元素, 并判断是否有右孩子,如果有右孩子入栈,并继续往左孩子找,直到某节点为单节点,出栈并访问。需要注意的是因为有可能一个节点我们 会访问两次,所以我们设置一个指针r用来表示上一次被访问过得节点,防止又把它的右孩子再次入栈。struct biTree {//树的结构体 char data; struct...
2021-03-25 17:20:46
1927
1
原创 先序遍历(非递归)
试写出先序遍历(非递归算法) 分析: 和中序遍历大同小异,唯一的差别在于每次先访问节点,在判断有没有左孩子,有则入栈,然后出栈,往右走。直至栈空代码如下:struct biTree {//树的结构体 char data; struct biTree *lchild; struct biTree *rchild;};struct Stack {//栈的结构体 char* arr; //内存首地址 int len; //栈的容量 int top; //栈的下...
2021-03-25 16:52:20
6977
1
原创 中序遍历(非递归)
试写出中序遍历的非递归算法 分析: 如果采用非递归,我们就需要用到栈这个数据结构了,具体流程为:从根节点一路往下找左孩子并将其入栈直至左孩子为空 然后依次出栈,并判断是否存在右孩子,如果有,右孩子入栈,继续往下找左孩子,如此重复直至栈空。本题代码如下:struct biTree {//树的结构体 char data; struct biTree *lchild; struct biTree *rchild;};struct Stack {...
2021-03-25 16:38:26
2314
原创 先序创建二叉树,中序、先序、后序遍历
该文件用于创建一颗链表二叉树,测试创建二叉树,先序、中序、后序三种遍历方式创建二叉树代码如下:#define _CRT_SECURE_NO_WARNINGS#define TYPE charstruct biTree { TYPE data; struct biTree *lchild; struct biTree *rchild;};#include <stdio.h>#include <stdlib.h>biTree *create(biTree *
2021-03-25 14:52:29
3061
原创 顺序存储二叉树之寻找公共祖先节点
题目:已知一课二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值 分析: 利用数组存储一颗二叉树,一般来说我们用这种方式存储一颗完全二叉树,不浪费空间。然后我们可以依据其下标的特性,下标的二分之一既是该节点的父节点代码如下:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>int findCommonAncesto...
2021-03-25 10:48:19
1756
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人