数据结构
数据结构学习笔记
Charming2017
What I’m doing right now, I’m chasing perfection.——Kobe Bryant
展开
-
递归和非递归快速排序算法实现
快速排序快速排序算法核心思想,在快速排序过程中,通过一趟划分,可以把待排序区间分为两个子区间,然后分别对这两个子区间再进行同样的划分,这样的套娃机制我们常常使用递归算法解决比较轻松,不过也可以通过非递归的方法实现。比如我们下面讲到的非递归算法,分别使用了栈,还有队列实现,以栈为例,栈的作用就是在处理一个子区间的时候,保存产生的新的左、右区间,待一个区间处理完后,再从栈中取出另外一个子区间进行处理递归算法实现栈实现队列实现// 快速排序的两种实现方式1-递归2-非递归#include &l原创 2021-10-23 18:03:26 · 627 阅读 · 0 评论 -
十种排序算法总结(详解附实现代码)
直接插入排序折半插入排序希尔插入排序冒泡排序快速排序简单选择排序堆排序归并排序基数排序外部排序原创 2021-10-22 12:03:41 · 217 阅读 · 0 评论 -
一张图搞掂哈希表
哈希表散列表(Hash Table),称哈希表。是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关原创 2021-10-19 11:41:36 · 329 阅读 · 0 评论 -
B树和B+树
B树和B+树一、B树二、B+树三、对比原创 2021-10-19 10:53:02 · 99 阅读 · 0 评论 -
关键路径-数据结构
关键路径AOE网全称 Activity On Edge Network有向边,带有权值,权值代表时间花销,有向边代表活动顶点代表事件,事件是某个状态,立刻马上,没有时间花销相关概念在AOE网中仅有1个入度为0的顶点,我们叫源点,这个顶点的事件我们称整个工程的开始状态在AOE网中仅有一个出度为0的顶点,我们叫汇点,即结束顶点,该顶点事件我们称整个工程的结束状态从源点到汇点的路径有多条,最长那条就是关键路径,关键路径上面的活动叫关键活动,注意活动是一段时间内完成的求解方法求出所有原创 2021-10-16 12:15:52 · 350 阅读 · 0 评论 -
拓扑排序C++代码实现
拓扑排序//伪代码typedef struct ArcNode{ int adjvex;//该边指向的顶点的下标 struct ArcNode *nextarc;//下条边指针}ArcNode;typedef struct VNode{ char data;//顶点信息 例如a,b,c... ArcNode *firstarc;}VNode, AdjList[10];//最多10个顶点typedef struct{ AdjList vertices;//邻接表 int vexnum原创 2021-10-16 11:46:20 · 690 阅读 · 2 评论 -
二叉树基本操作C++实现
二叉树基本操作C++实现基本操作预览:先序遍历: element:1 element:2 element:3中序遍历: element:2 element:1 element:3二叉树的结点个数: 3度为2的结点个数: 1度为1的结点个数: 0叶子结点个数: 2二叉树的高度: 2是不是完全二叉树(1-是;0-不是): 1#include <stdio.h>#include <iostream>using namespace std;typedef st原创 2021-10-14 14:36:32 · 1025 阅读 · 0 评论 -
哈夫曼树与哈夫曼编码
哈夫曼树概念哈夫曼树也是二叉树叶子结点的权值,权值比如重要性,某种含义的数字叶子结点的带权路径长度 = 根到该结点的路径长度(也可以说是该叶子结点的父亲结点的高度)*该结点的权值树的带权路径长度WPL = 树中所有叶子结点的带权路径长度之和哈夫曼树是WPL最小的二叉树,比它大的都不叫哈夫曼树,由此可见哈夫曼树也是最优二叉树构造哈夫曼树每次选2个叶子结点权值最小的合并,并将2个权值的和作为新的根结点的权值由此可见,如果有n个结点,会有n-1次合并,也就是会多出n-1个非叶子结原创 2021-10-13 17:03:55 · 473 阅读 · 0 评论 -
平衡二叉树
平衡二叉树AVL树是带有平衡条件的二叉查找树,命名的由来是1962年 Adelson-Velskii和Landis 提出一篇论文,名字从名字中摘取而来代码实现:LL类型原来结点情况*gf->lchild/rchild = f;*f -> A//(根结点)*p->B//(根结点的左孩子)其中 f是爹,p为左孩子,gf是f他爹现在旋转f->lchild = p->rchild;//A的左孩子是原先B的右孩子p->rchild = f;//B的右孩原创 2021-10-13 11:34:06 · 84 阅读 · 0 评论 -
二叉排序树
二叉排序树二叉排序树,就是有数字有规律的树,左子树所有结点值小于根结点的值,同时根结点的值小于右子树所有结点的值原创 2021-10-13 01:19:54 · 98 阅读 · 0 评论 -
Prim和Kruscal最小生成树算法
最小生成树Prim算法Prim算法 主要是从结点出发,需要用到2个数组path数组保存结点从哪个结点过来lowcost保存起始结点到其他结点的代价,可以直接读邻接矩阵的内容path = {-1, 1, 1, 0, 0}lowcost = {0, 10, 5, ∞, ∞}显然我们要遍历n-1轮,每1轮确定1个结点第1轮遍历 找到lowcost中最小不为0的值,数组下标代表顶点确定顶点后,看下跟他相连的结点的代价,跟原来的代价,谁大谁小,小的替换大的,修改代价后把path对应的点改成当前顶点原创 2021-10-12 16:22:18 · 299 阅读 · 0 评论 -
非递归图的深度优先遍历算法
非递归图的深度优先遍历支持无向图和有向图,讲道理有向图的代码会比无向图的更容易理解,下面代码都做了兼容#include <stdio.h>#include <iostream>#include <stdlib.h>#include <time.h>using namespace std;#define MAX_NUM 20 //顶点的最大个数bool visited[5];原创 2021-10-11 12:54:38 · 1768 阅读 · 1 评论 -
图的广度优先遍历实现
图的广度优先遍历图的广度优先遍历,除了本身存储顶点和邻边的信息需要存储空间外,还需要借助一个队列,空间复杂度是O(1)~O(Vertex)其实这个遍历算法跟树的层次遍历很类似,也是加多了个visited[] 数组标记是否已经访问过,避免死循环的情况直接上代码#include <stdio.h>#include <iostream>#include <stdlib.h>#include <time.h>using namespace std;原创 2021-10-11 10:16:39 · 461 阅读 · 0 评论 -
图的深度优先遍历算法
图的深度优先遍历算法图的深度优先遍历算法,适用无向图和有向图跟树的先序遍历实现思想相同,只不过多了个数组标记已访问的顶点#include <stdio.h>#include <iostream>#include <stdlib.h>#include <time.h>using namespace std;#define MAX_NUM 20 //顶点的最大个数bool visited[5];原创 2021-10-10 23:18:15 · 2089 阅读 · 0 评论 -
树的双亲表示法C++代码实现
树的双亲表示法// 树的存储结构(包含二叉树)// 双亲表示法#include <stdio.h>#include <iostream>using namespace std;#define MAX_TREE_SIZE 100typedef struct{ int data; int parent;//数组下标} PNode;// 默认下标为0是根结点typedef struct{ PNode nodes[MAX_TREE_S原创 2021-10-08 21:14:10 · 667 阅读 · 0 评论 -
树的孩子兄弟表示法C++代码实现
树的孩子兄弟表示法// 孩子兄弟表示法#include <stdio.h>#include <iostream>using namespace std;#define ElemType chartypedef struct Node{ ElemType data; struct Node * firstchild,*nextsibling;}Node,*Tree;Tree init_data2(Tree tree){ ElemTy原创 2021-10-08 20:54:30 · 1349 阅读 · 0 评论 -
树的孩子表示法C++代码实现
树的孩子表示法树的孩子表示法,概念很简单,是用一个数组保存每个节点的数据,每个节点再用1个链表保存树的关系比如{<R,A>,<R, B>},这个数有3个节点,数组长度是3,然后有3个链表R的链表有{头结点,A,B}A的链表有{头结点}B的链表有{头结点}下面用代码实现#include <stdio.h>#include <iostream>using namespace std;#define MAX_TREE_SIZE 100原创 2021-10-08 16:12:41 · 1168 阅读 · 0 评论 -
图的基本概念以及常见公式汇总
图的基本概念无向图对于n个顶点的无向图G所有顶点的度 = 2*edge如果是连通图,即任意2个顶点都有路径,最少有n-1条边,比如树就满足如果是非连通图,最多边的情况就是把1个顶点摘出来,其他顶点两两之间都有路径,这种情况边(n-1)*(n-2)无向完全图有n*(n-1)条边有向图对于n个顶点的有向图G所有顶点的出度 = 所有顶点的入度 = edge,所有顶点的度 = 2*edge如果是强连通图,即任意2个顶点都有路径,最少有n条边,比如简单回路有向完全图有2n(n-1)条边原创 2021-10-07 09:52:27 · 1236 阅读 · 1 评论 -
树的基本概念
树原创 2021-10-07 09:01:49 · 94 阅读 · 0 评论 -
前中后3种非递归遍历二叉树代码实现
从根结点出发,依次把左结点压入栈中,直到下一个左结点为NULL,此时栈是有数据的,然后查看栈顶元素是否有右结点,接着以这个右结点出发,也就是看成根结点,再重复上面的操作,这个时候我们只是把从根结点出发到最左边的结点途中经过的结点压入栈中。原创 2021-10-06 15:52:54 · 130 阅读 · 0 评论 -
二叉树4种遍历代码实现
二叉树4种遍历代码实现前序遍历中序遍历后序遍历层次遍历前3种遍历空间复杂度是O(h),h:二叉树深度层次遍历空间复杂度是O(1)+队列// 二叉树的代码实现#include <stdio.h>#include <iostream>using namespace std;#define MaxSize 50typedef struct TNode{ int data; struct TNode *lchild, *rchild;}原创 2021-10-05 19:39:47 · 1799 阅读 · 0 评论 -
C++实现字符串基本操作
串#include <stdio.h>#include <iostream>using namespace std;#define MaxSize 50typedef struct{ char data[MaxSize]; int length;} SString;// 让位序和下标对应,浪费一个存储单元void StrAssign(SString &S, char *ch){ int i = 0; while (c原创 2021-10-05 11:58:40 · 318 阅读 · 0 评论 -
栈的括号匹配实现
栈的括号匹配实现算法思想:从左至右扫描一个字符串,则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描过程中把所遇到的左括号,存放到堆栈中。每当遇到一个右括号时,就将它与栈顶的左括号相匹配,同时从栈顶删除该左括号温馨提示:右边的括号是不会入栈的,只有左边括号的入栈,当扫描到又括号时,我们让栈出来一个左括号,检查是否跟它匹配我们用顺序栈实现这个算法,有需要的小伙伴可以找我要链式栈的实现代码// 括号匹配#include <stdio.h>#include <原创 2021-10-05 01:34:04 · 298 阅读 · 0 评论 -
队列详解+代码实现
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列(Queue)是一种先进先出(First In First Out)的线性表,简称FIFO。 允许插入的一端叫做队尾,删除的一端叫做队头原创 2021-10-04 12:07:19 · 449 阅读 · 0 评论 -
顺序栈和链式栈的代码实现
栈的基本概念,一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则原创 2021-10-04 01:58:19 · 353 阅读 · 0 评论 -
线性表——顺序存储结构
顺序存储结构#include <stdio.h>#include <iostream>#define MaxSize 10using namespace std;typedef struct SeqList{ int data[10]; int length = 0;}SeqList;void init(SeqList &L){ L.length = 0;}bool insert(SeqList &L, int原创 2021-10-03 15:01:07 · 91 阅读 · 0 评论 -
带头结点的双链表
带头结点的双链表#include <stdio.h>#include <iostream>using namespace std;typedef struct LNode{ int data = 0; struct LNode *next;//后继指针 struct LNode *prior;//前驱指针}LNode, *LinkList;bool init_list(LinkList &L){ L = (LNode *原创 2021-10-02 03:09:58 · 261 阅读 · 0 评论 -
数据结构-基础
基础原创 2021-09-13 00:24:10 · 97 阅读 · 0 评论