考研数据结构
如初⁰
以梦为马
展开
-
数据结构第五章——树与二叉树知识点汇总
树的基本概念 树的常考性质 二叉树 二叉树的常考性质 二叉树存储结构 二叉树先/中/后序遍历 二叉树的层序遍历 由遍历序列构造二叉树 线索二叉树的概念 二叉树线索化 线索二叉树找前驱/后继 树的存储结构 树、森林的遍历 二叉排序树 平衡二叉树 哈夫曼树 ...原创 2020-06-16 19:29:25 · 731 阅读 · 0 评论 -
数据结构笔记——Dijkstra算法
写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲!一、BFS算法的局限性带权路径长度——当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度BFS算法求单源最短路径只适用于无权图,或所有边的权值都相同的图二、Dijkstra算法初始:从V0开始,初始化三个数组信息如下第1轮:循环遍历所有结点,找到还没确定最短路径,且dist最小的顶点Vi,零final[j] = true检查所有邻接自Vi的顶点,若其final值为fals.原创 2020-06-16 19:22:14 · 1694 阅读 · 1 评论 -
数据结构笔记——最短路径BFS算法
写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲!目录一、最短路径问题二、BFS求无权图的单源最短路径三、代码实现四、总结一、最短路径问题单源最短路径——BFS算法、Dijkstra算法其中BFS算法(无权图)、Dijkstra算法(带权图,无权图)各顶点间的最短路径——Floyd算法(带权图、无权图)二、BFS求无权图的单源最短路径注:无权图可以视为一种特殊的带权图,只是每条边的权值都为1三、代码实现boo.原创 2020-06-16 19:03:35 · 12605 阅读 · 2 评论 -
数据结构笔记——最小生成树
写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲!目录知识总览一、生成树二、广度优先生成树三、深度优先生成树四、最小生成树(最小代价树)五、Prim算法(普里姆)六、Kruskal算法(克鲁斯卡尔)七、Prim算法 vs Kruskal算法八、Prim算法的实现思想九、Kruskal算法的实现思想十、总结知识总览一、生成树连通图的生成树是包含图中全部顶点的一个极小连通子图。(边尽可能的少,但要保持连通)若图中顶点树为n,则它的.原创 2020-06-16 16:11:30 · 1917 阅读 · 0 评论 -
数据结构笔记——图的深度优先遍历(DFS)
写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲!目录一、树的深度优先遍历二、图的深度优先遍历三、算法存在的问题五、复杂度分析空间复杂度时间复杂度六、深度优先遍历序列七、深度优先生成树八、深度优先生成树森林九、图的遍历与图的连通性十、总结一、树的深度优先遍历void PreOrder(TreeNode *R){ if(R != NULL){ visit(R); while(R还有下一个子树T) .原创 2020-06-16 15:05:56 · 35038 阅读 · 3 评论 -
数据结构笔记——图的广度优先遍历(BFS)
目录一、树的广度优先遍历二、图的广度优先遍历三、树VS图四、代码实现五、广度优先遍历序列六、遍历序列的可变性七、算法存在的问题八、BFS算法(Final版)九、复杂度分析十、广度优先生成树十一、广度优先生成森林十二、总结一、树的广度优先遍历通过根节点,可以找到下一层的结点2,3,4通过234又可以找到再下一层的结点5678二、图的广度优先遍历广度优先序列:21453748三、树VS图树不存在“回路”,搜索相邻的结原创 2020-06-14 19:32:43 · 6924 阅读 · 1 评论 -
数据结构笔记——图的基本操作
目录一、基本操作1.Adjacent(G,x,y):判断图G是否存在边或(x,y),y>2.Neighbors(G,x):列出图G中与结点x邻接的边3.InsertVertex(G,x),在图G中插入顶点x4.DeleteVertex(G,x),从图G中删除顶点x5.AddEdge(G,x,y):若无向边(x,y)或有向边不存在,则向图G中添加该边,y>6.RemoveEdge(G,x,y):若无向边(x,y)或有向边存在,则从图G中删除该边,y>7.Fir原创 2020-06-14 16:51:57 · 2108 阅读 · 1 评论 -
数据结构笔记——图的存储之十字链表、邻接多重表
一、邻接矩阵、邻接表存储有向图有向图邻接矩阵邻接表邻接表与邻接矩阵的区别二、十字链表存储有向图弧结点顶点结点有向图十字链表三、十字链表性能分析空间复杂度O(|V| + |E|)Q1:如何找到指定顶点的所有出边?——顺着绿色线路找Q2:如何找到指定顶点的所有入边?——顺着橙色线路找四、邻接矩阵、邻接表存储无向图无向图邻接矩阵邻接表五、邻接多重表存储无向图边结点顶点结点无向图邻接多重表两种情况①当去掉...原创 2020-06-13 19:36:37 · 397 阅读 · 0 评论 -
数据结构笔记——图的存储之邻接表法
目录一、邻接表法(顺序+链式存储)二、邻接表法三、邻接表和邻接矩阵的区别一、邻接表法(顺序+链式存储)//用邻接表存储的图typedef struct{ AdjList vertices; int vexnum,arcnum;}ALGraph;//"顶点"typedef struct VNode{ VertexType data; //顶点信息 ArcNode *first; //第一条边/弧}VNode,AdjList[MaxV原创 2020-06-13 19:10:22 · 936 阅读 · 0 评论 -
数据结构笔记——图的存储之邻接矩阵法
目录一、定义结构体二、邻接矩阵法存储带权图(网)三、邻接矩阵法的性能分析四、邻接矩阵法的性质五、总结一、定义结构体#define MaxVertexNum 100 //顶点数目的最大值typedef struct{ char Vex[MaxVertexNum]; //顶点表 int Edge[MAXVertexNum][MaxVertexNum]; //邻接矩阵,边表 int vexnum,arcnum; //图的当前顶点树和边原创 2020-06-12 20:35:49 · 893 阅读 · 0 评论 -
数据结构笔记——图的基本概念
目录一、图的定义二、图逻辑结构的应用三、无向图、有向图四、简单图、多重图五、顶点的度、入度、出度六、顶点-顶点的关系描述七、连通图、强连通图八、研究图的局部——子图九、连通分量、强连通分量十、生成树十一、生成森林十二、边的权、带权图/网十三、带权图的应用举例十四、几种特殊形态的图十五、总结一、图的定义图G由顶点集V和边集E组成,记G=(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V={V1原创 2020-06-12 19:57:24 · 2699 阅读 · 0 评论 -
数据结构笔记——哈夫曼树
目录一、带权路径长度二、哈夫曼树的定义三、哈夫曼树的构造四、哈夫曼编码五、总结一、带权路径长度结点的权:有某种现实含义的数值(如:表示结点的重要性等)结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积树的带权路径长度:树中所有叶子结点的带权路径长度之和二、哈夫曼树的定义在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树三、哈夫曼树的构造给定n个权值分别为w1,w2,.原创 2020-06-11 20:55:24 · 4045 阅读 · 0 评论 -
最美二叉树—平衡二叉树
目录一、平衡二叉树的定义二、平衡二叉树的插入三、调整最小不平衡子树A四、调整最小不平衡子树(LL)五、调整最小不平衡子树(RR)七、调整最小平衡子树(LR)八、调整最小不平衡子树(RL)九、调整最小不平衡子树十、练习十、查找效率分析十一、总结一、平衡二叉树的定义平衡二叉树,简称平衡树(AVL树)——树上任一结点的左子树和右子树的高度之差不超过1。结点的平衡因子=左子树高-右子树高。typedef struct AVLNode{ int k原创 2020-06-11 19:06:07 · 2099 阅读 · 0 评论 -
数据结构笔记——二叉排序树
一、二叉排序树的定义二、二叉排序树的查找三、二叉树的插入四、二叉排序树的构造五、二叉排序树的删除六、查找效率分析七、总结原创 2020-06-10 17:39:22 · 1077 阅读 · 0 评论 -
数据结构笔记——树、森林的遍历
一、树的逻辑结构二、树的先根遍历三、树的后根遍历四、树的层次遍历五、森林的先序遍历六、森林的中序遍历七、总结...原创 2020-06-10 17:20:44 · 1509 阅读 · 0 评论 -
数据结构笔记——树存储结构
目录一、树的逻辑结构二、双亲表示法(顺序存储)三、回顾:二叉树的顺序存储四、孩子表示法(顺序+链式存储)五、孩子兄弟表示法(链式存储)六、森林和二叉树的转换七、总结一、树的逻辑结构二、双亲表示法(顺序存储)双亲表示法:每个结点中保存指向双亲的“指针”#define MAX_TREE_SIZE 100typedef struct{ ElemType data; int parent;}PTNode;typedef struc原创 2020-05-31 22:06:06 · 524 阅读 · 0 评论 -
数据结构笔记——线索二叉树找前驱/后继
目录一、中序线索二叉树找中序后继二、中序线索二叉树中找中序前驱三、先序线索二叉树找先序后继四、先序线索二叉树找先序前驱五、后序线索二叉树找后序前驱六、后序线索二叉树找后序后继七、总结一、中序线索二叉树找中序后继在中序线索二叉树中找到指定结点*p的中序后继next①若p->rtag == 1,则next = p->rchild②若p->rtag == 0//找到以P为跟的子树中,第一个被中序遍历的结点ThreadNode *Fi原创 2020-05-30 21:17:44 · 10480 阅读 · 13 评论 -
王道数据结构笔记——二叉树线索化
目录一、用土方法找到中序前驱二、中序线索化三、中序线索二叉树四、中序线索化(王道教材版)五、先序线索化六、先序线索化(王道教材版)七、后序线索化八、后序线索化(王道教材版)九、总结一、用土方法找到中序前驱//中序遍历void InOrder(BiTree T){ if(T != NULL){ InOrder(T->lchild); //递归遍历左子树 visit(T); //访问根结点原创 2020-05-29 22:02:21 · 1500 阅读 · 4 评论 -
数据结构笔记——线索二叉树的概念
目录一、二叉树的中序遍历序列二、中序线索二叉树三、线索二叉树的存储结构四、中序线索二叉树的存储五、先序线索二叉树六、先序线索二叉树的存储七、后序线索二叉树八、后序线索二叉树的存储九、三种线索二叉树的对比十、总结一、二叉树的中序遍历序列二、中序线索二叉树三、线索二叉树的存储结构四、中序线索二叉树的存储五、先序线索二叉树六、先序线索二叉树的存储七、后序线索二叉树八、后序线索二叉树的存储九、三种线索二叉树的对比原创 2020-05-28 11:54:44 · 407 阅读 · 0 评论 -
数据结构笔记——由遍历序列构造二叉树
目录一、不同二叉树的中序遍历序列二、前序+中序遍历序列三、后序+中序遍历序列四、层序+中序遍历序列五、若前序、后序、层序序列两两组合?六、总结一、不同二叉树的中序遍历序列中序遍历:中序遍历左子树、根结点、中序遍历右子树前序遍历:根结点、前序遍历左子树、前序遍历右子树后序遍历:前序遍历左子树、前序遍历右子树、根结点结论:若只给出一棵二叉树的前、中、后、层序遍历序列中的一种,不能唯一确定一棵二叉树二、前序+中序遍历序列前序遍历序列:根结点.原创 2020-05-27 22:13:39 · 3494 阅读 · 1 评论 -
数据结构笔记——二叉树的层序遍历
目录一、二叉树的层序遍历二、代码实现三、总结一、二叉树的层序遍历算法思想:①初始化一个辅助队列②根结点入队③若队列非空,则队头结点出队,访问该结点,将其左右孩子插入队尾(如果有的话)④重复③直至队列为空二、代码实现//层序遍历void LevelOrder(BiTree T){ LinkQueue Q; InitQueue(Q); //初始化辅助队列 BiTree p; EnQueue(Q,T); /原创 2020-05-27 21:47:56 · 501 阅读 · 0 评论 -
数据结构笔记——二叉树先/中/后序遍历
目录一、什么是遍历二、二叉树的遍历(手写练习)三、先序遍历(代码)四、中序遍历(代码)五、后序遍历(代码)六、求先序遍历序列七、求中序遍历序列八、求后序遍历序列九、求树的深度(应用)十、总结一、什么是遍历遍历:按照某种次序把所有结点都访问一遍二、二叉树的遍历(手写练习)二叉树的递归特性:①要么是个空二叉树②要么就是由“根节点+左子树+右子树”组成的二叉树先序遍历:根左右(NLR)中序遍历:左根右(LNR)后序遍历:左原创 2020-05-26 22:05:01 · 590 阅读 · 0 评论 -
数据结构笔记——二叉存储结构
目录一、二叉树的顺序存储二、二叉树的链式存储三、总结一、二叉树的顺序存储#define MaxSize 100struct TreeNode{ ElemType value; //结点中的数据元素 bool isEmpty; //结点是否为空};TreeNode t[MaxSize];定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次存储完全二叉树中的各个结点几个重要常考的基本操作:若完全二叉树中共有n个结点,则原创 2020-05-26 21:32:51 · 398 阅读 · 0 评论 -
数据结构笔记——二叉树的常考性质
目录一、二叉树的常考性质考点1考点2考点3二、完全二叉树的常考性质考点1考点2三、总结一、二叉树的常考性质考点1设非空二叉树中度为0、1和2的结点个数分别为n0,n1和n2,则n0 = n2 + 1(叶子结点比二分支结点多一个)假设树中结点总数为n,则①n = n0 + n1 + n2②n = n1 + 2n2 + 1(树的结点数 = 总度数 + 1)考点2二叉树第i层至多有2^(i-1)个结点m叉树第i层至多有m^(i-1)个结点.原创 2020-05-22 11:49:06 · 465 阅读 · 0 评论 -
数据结构笔记——二叉树
目录一、知识总览二、二叉树的概念三、二叉树的五种状态四、几个特殊的二叉树五、总结一、知识总览二、二叉树的概念二叉树是n个结点的有限集合:①或者为空二叉树,即n = 0;②或者是由一个根节点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树特点:①每个结点至多只有两颗子树②左右子树不能颠倒(二叉树是有序树)二叉树是递归定义的数据结构三、二叉树的五种状态四、几个特殊的二叉树1.满二叉树一棵高度为h,且含有原创 2020-05-22 11:23:02 · 447 阅读 · 0 评论 -
数据结构笔记——树的常考性质
目录一、树的常考性质二、总结一、树的常考性质考点1:结点数=总度数+1考点2:度为m的树、m叉树的区别考点3:度为m的树第1层至多有m^(i-1)个结点考点4:考点5:m^(h-1) < n(m-1) + 1 <= m^hh - 1<logm(n(m-1) + 1) <= h二、总结...原创 2020-05-21 19:08:46 · 561 阅读 · 0 评论 -
数据结构笔记——树的基本概念
目录一、树的基本概念二、树形逻辑结构的应用三、结点之间的关系描述四、结点、树的属性描述五、有序树和无序树六、树和森林七、总结一、树的基本概念空树:结点树为0的结点,有且仅有一个根节点没有后继的结点称为“叶子节点”,有后继的结点称为“分支结点”除根节点外,任何结点都有且仅有一个前驱,每个结点可以有0个或多个后继二、树形逻辑结构的应用三、结点之间的关系描述四、结点、树的属性描述属性:结点的层次(深度)——从上往下数.原创 2020-05-21 19:01:03 · 508 阅读 · 0 评论 -
数据结构第四章——串知识点汇总
串的定义与基本操作 串的存储结构 朴素模式匹配算法 KMP算法(一) KMP算法(二) KMP算法优化(nextval数组)原创 2020-05-21 16:13:03 · 622 阅读 · 0 评论 -
数据结构——KMP算法优化(nextval数组)
一、KMP算法存在的问题多进行了一次无意义的对比二、KMP算法优化加一个判断字符相等的数组nextval[j]...原创 2020-05-21 08:53:46 · 559 阅读 · 0 评论 -
数据结构笔记——KMP算法(二)
原创 2020-05-18 21:34:02 · 299 阅读 · 0 评论 -
数据结构笔记——KMP算法
朴素模式匹配算法的缺点:当某些子串与模式串能部分匹配时,主串的扫描指针i经常回溯,导致时间开销增加原创 2020-05-17 21:01:29 · 303 阅读 · 0 评论 -
数据结构笔记——朴素模式匹配算法
目录一、什么是模式匹配二、朴素模式匹配算法三、朴素模式匹配算法性能分析四、总结一、什么是模式匹配主串:S=‘wangdao’子串:'wang'、'ang'、'ao'....模式串:'gda'、'bao'串的模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。二、朴素模式匹配算法定位操作(模式匹配)——Index(S,T)。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置:否则函数值为0代码实现:int Index.原创 2020-05-16 19:20:44 · 4163 阅读 · 1 评论 -
数据结构第三章——栈和队列知识点汇总
栈 顺序栈的实现 队列的定义 队列的顺序存储 队列的链式存储 双端队列 栈的应用(括号匹配问题) 栈的应用(表达式求值) 栈的应用(二) 栈的应用(递归) 队列应用 ...原创 2020-05-15 17:39:43 · 917 阅读 · 0 评论 -
数据结构第二章——线性表知识点汇总
顺序表的定义 顺序表的插入删除 顺序表的查找 单链表的定义 单链表的插入及删除 单链表的查找 单链表的建立 双向链表的插入遍历及删除 循环链表 静态链表 顺序表VS链表 ...原创 2020-05-15 17:35:32 · 467 阅读 · 0 评论 -
数据结构笔记——串的存储结构
目录一、串的顺序存储1.静态数组实现(定长顺序存储)2.动态数组实现3.存储方式二、串的链式存储三、基本操作的实现1.求子串SubString(&Sub,S,pos,len)2.比较操作。StrCompare(S,T)3.定位操作。Index(S,T)四、总结一、串的顺序存储1.静态数组实现(定长顺序存储)#define MAXLEN 255typedef struct{ char ch[MAXLEN]; int length原创 2020-05-15 17:25:27 · 649 阅读 · 0 评论 -
数据结构笔记——串的定义与基本操作
一、串的定义例:S='Hello World!'T="iPhone 11 Pro Max?"注:有的地方用双引号(如Java、C),有的地方用单引号(如Python)子串:串中任意个连续的字符组成的子序列。Eg:'iPhone','Pro M'是串T的子串主串:包含子串的串。Eg:T是子串'iPhone'的主串字符在主串中的位置:字符在串中的序号。Eg:'1'在T中的位置是8(第一次出现)子串在主串中的位置:子串的第一个字符在主串中的位置。Eg:'11 Pro'在T中的位原创 2020-05-14 20:12:11 · 1532 阅读 · 0 评论 -
数据结构笔记——队列应用
目录一、树的层次遍历二、图的广度优先遍历三、在操作系统中的应用一、树的层次遍历①②③④⑤⑥⑦⑧⑨⑩11二、图的广度优先遍历①②③④⑤⑥⑦⑧三、在操作系统中的应用多个进程争抢着使用有限的系统资源时,FCFS(先来先服务)是一种常用策略。Eg:打印数据缓冲区...原创 2020-05-13 20:17:28 · 266 阅读 · 0 评论 -
数据结构笔记——栈的应用(递归)
目录一、函数调用背后的过程二、栈在递归中的应用三、总结一、函数调用背后的过程函数调用的特点:最后被调用的函数最先执行结束(LIFO)函数调用时,需要用一个栈存储:①调用返回地址②实参③局部变量二、栈在递归中的应用适合用“递归”算法解决:可以把原始问题转换为属性相同,但规模较小的问题Eg 1: 计算正整数的阶乘递归调用时,函数调用栈可称为“递归工作栈”每进入一层递归,就将递归调用所需信息压入栈顶每退出一层递归,就从栈顶弹出相应信息E.原创 2020-05-13 20:09:08 · 3539 阅读 · 0 评论 -
数据结构笔记——栈的应用(二)
目录一、中缀表达式转后缀表达式(机算)二、中缀表达式的计算(用栈实现)一、中缀表达式转后缀表达式(机算)初始化一个栈,用于保存暂时还不确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况:①遇到操作数。直接加入后缀表达式。②遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到弹出“(”为止。注:“(”不加入后缀表达式。③遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(”或栈空则停原创 2020-05-12 20:17:23 · 1070 阅读 · 0 评论 -
数据结构笔记——栈的应用(表达式求值)
目录一、熟悉的算数表达式二、波兰数学家的灵感三、中缀、后缀、前缀表达式中缀转后缀的手算方法:后缀表达式的计算(手算):后缀表达式的计算(机算):中缀转前缀的手算方法:前缀表达式的计算(机算):四、总结一、熟悉的算数表达式由三个部分组成:操作数、运算符、界限符界限符是必不可少的,反映了计算的先后顺序二、波兰数学家的灵感可以不用界限符也能无歧义地表达运算顺序逆波兰表达式=后缀表达式、波兰表达式=前缀表达式三、中缀、后缀、前缀表...原创 2020-05-11 19:31:13 · 576 阅读 · 0 评论