
数据结构
mengzhisuoliu
我有我自由你有感受
展开
-
数据结构之二叉树的遍历,前序遍历,中序遍历,后序遍历
二叉树的遍历,分为前序遍历,中序遍历,后序遍历,对这几种遍历总是有点模糊,今天做一下详细的笔记吧前序遍历:A B C D E F G H K,遍历指导:从根节点开始,先左后右中序遍历:B D C A E H G K F,遍历指导,从左节点开始,一直遍历到无左节点,然后回溯。(先左后右)后序遍历:D C B H K G F E A,遍历指导,先左后右,最后根...原创 2019-07-24 14:35:18 · 942 阅读 · 0 评论 -
静态链表
当某些语言不支持指针的时候,我们如何实现一个链表的数据结构呢??那么我们可以采用静态链表#define MAXSIZE 999typedef struct{ ElementType Data;//数据 int cur;//游标 相当于next指针}Component,StaticLinkList[MAXSIZE]我们队数组的第0个和最后一个元素做特殊处理,他们的data原创 2015-05-07 17:13:36 · 420 阅读 · 0 评论 -
腾讯面试题:查找单链表的中间节点
问题如题:方法一:我们通过遍历单链表的得到单链表的长度L,Mid=L/2,那么我们再遍历到Mid这个点就获取到了这个中间节点了时间复杂度:O(L+L/2)=O(3L/2);方法二:快慢指针,我们定义两个指针,一个search指针,一个是quick指针,quick指针的步长是search指针的2倍,当quick指针到达链表尾部,则search此时就是中间节点了!时间复杂度:O原创 2015-05-07 16:34:18 · 624 阅读 · 0 评论 -
约瑟夫问题(单向循环链表应用实例)
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人原创 2015-05-07 15:28:37 · 1716 阅读 · 0 评论 -
判断链表是否有环(两种方法)
如何判断一个链表是否是一个循环链表呢?什么链表是一个循环链表?看图:一.步数比较法判断是否有环int HasLoop1(LinkList L){ LinkList cur1=L;//定义结点cur1 int pos1=0,pos2=0; while(cur1){ pos2=0;//每次重设为0 LinkList cur2=L; while(cur2){原创 2015-05-07 13:42:52 · 1426 阅读 · 0 评论 -
单向循环链表的应用
拉丁方阵是一种n * n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中,恰好出现一次。著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵丽元素的符号,拉丁方阵因此而得名.例如下图是一个3 * 3的拉丁方阵:上图每一行看,每一行的元素没有重复,从每一列看每一行的元素也没有重复,这就是拉丁方阵!那么我们如何通过编程解决这样的问题呢?我们可以通过单向循环链原创 2015-05-07 10:14:48 · 580 阅读 · 0 评论 -
维吉尼亚密码原理图解
维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:TO BE OR NOT TO BE THAT IS THE QUESTION当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对原创 2015-05-06 22:18:32 · 46667 阅读 · 0 评论 -
双链表实例
我们实现一个功能,26个字母,我们输入一个正数就从前面数到这个正数的位置按顺序开始输出,一共输出26个字母,比如输入3,那么输出:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C如果输入一个负数我们从后面开始数,数到这个位置我们又按照顺序开始出书,比如输入-3, X Y Z A B C D E F G H I J K L M N原创 2015-05-06 21:47:01 · 426 阅读 · 0 评论 -
2进制转8进制,8进制转10进制,8进制转16进制
二进制转八进制:二进制数据:100111101,从每每3位转换为8进制的每一位101=5111=7100=4八进制的结果:475八进制:475转换为 十进制5*8^0 +7*8^1+4*8^2=5+56+256=317八进制:475 转换为 十六进制第一种:他们之间的转换可以先转成二进制然后再相互转换。5*8^0原创 2015-05-06 16:24:32 · 1143 阅读 · 0 评论 -
中缀表达式转换后缀表达式
#define STACK_INIT_SIZE 20 //栈的元素个数#define STACKINCREMENT 10 //增长内存的大小#define MAXBUFFER 10typedef double ElementType;typedef struct { ElementType *base;//栈的基地址 ElementType *top;//栈顶 int stackS原创 2015-05-05 15:53:33 · 417 阅读 · 0 评论 -
逆波兰算法源码
#define STACK_INIT_SIZE 20 //栈的元素个数#define STACKINCREMENT 10 //增长内存的大小#define MAXBUFFER 10typedef double ElementType;typedef struct { ElementType *base;//栈的基地址 ElementType *top;//栈顶 int stackS原创 2015-05-05 15:15:22 · 689 阅读 · 0 评论 -
循环栈队列
定义一个循环队列#define MAXSIZE 100typedef struct{ ElemType* base;//用于存放内存分配基地址 int front;//出栈索引 int rear;//入栈索引}cycleQueue;初始化一个循环队列initQueue(cycleQueue* q){ q->base=(ElemType*)malloc(MAXSIZE* size原创 2015-05-05 11:37:45 · 1831 阅读 · 0 评论 -
汉诺塔
void HanNuoMove(int n,char x,char y,char z){ //汉诺塔移动 if(n==1){ printf("%c-->%c\n",x,z); }else{ HanNuoMove(n-1,x,z,y);//从X借助Z移动到Y printf("%c-->%c\n",x,z); HanNuoMove(n-1,y,x,z);//最后从Y借助X移动到Z原创 2015-05-04 22:58:57 · 318 阅读 · 0 评论 -
八皇后
编写出八皇后的算法->递归算法#include int nCount=0;int noDanger(int row,int j,int (*chess)[8]){ int i=0,k=0; //判断每一行的指定列是否有皇后 for(i=0;i<8;i++){ if(chess[row][i]){ return 0; } } //判断左上方 for(i=row;i>原创 2015-05-04 21:55:48 · 568 阅读 · 0 评论 -
KMP算法
一直以来KMP算法都不太理解,现在抽空进行了好好分析和研究一下,KMP的算法核心在于匹配串,根据匹配串的特征进行比对,KMP算法核心演示:原创 2015-05-04 16:24:40 · 439 阅读 · 0 评论 -
满二叉树与完全二叉树
满二叉树的特点:叶子只能出现在最下一层非叶子结点的度一定是2在同样深度的二叉树中,满二叉树的结点个数一定最多,同时叶子也是最多,下图就是满二叉树:完全二叉树对一棵具有n个结点的二叉树按层序编号,如果编号为i(1特点:叶子节点只能出现在最下两层最下层的叶子一定集中在左部连续位置倒数第二层,若有叶子结点,一定都在右部连续位置如果结点度为1,则该结点只有左孩子原创 2015-04-14 21:10:08 · 951 阅读 · 0 评论 -
二叉树的性质
性质1:对于任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0=N2+1,如下图:性质2:深度为K的二叉树至多有2^k然后减去1个结点(K>=1),上图的深度为3,所以它最多的结点数为:2^3 -1=7.性质3:在二叉树的第i层上至多有2^(i-1)个结点,如上图的2 3结点那层,是第2层,所以该层最多有2个结点!性质4:如果对一棵有n个结点的完全二叉树(其原创 2015-04-14 17:47:43 · 545 阅读 · 0 评论 -
线索二叉树
线索二叉树?什么是线索二叉树呢?一棵二叉树的左右叶子节点,注意是叶子节点,叶子的左结点和右结点一般为空,为了有效地利用其左右结点,我们将左结点指向他的前驱,将右结点指向他的后继!如图:创建线索二叉树,遍历线索二叉树代码:#include #include typedef char ElemType;//线索存储标志位//Link(0) 表示指向左右孩子的指针//Thread翻译 2015-04-14 15:44:38 · 584 阅读 · 0 评论 -
树,森林及二叉树的相互转换
为什么要将树,森林进行二叉树的转换呢?因为二叉树在查找的效率很高,而树的查找效率则相对低下!树转换成相应的二叉树分成三个步骤:1.在树中所有的兄弟结点之间加一条连线!2.对每个结点,除了保留与其长子的连线外,去掉该结点与其他孩子的连线!3.进行旋转调整位置!看图:森林转换成相应的二叉树分成三个步骤:1.首先将每课树转换成二叉树!2.然后将每课树的原创 2015-04-14 10:18:21 · 2671 阅读 · 2 评论 -
赫夫曼
在数据膨胀.信息爆炸的今天,数据压缩的意义不言而喻!谈到数据压缩,就不能提赫夫曼(Huffman)编码,赫夫曼编码是首个实用的压缩编码方案,即使在今天的许多知名压缩算法里,依然可以见到赫夫曼编码的影子!另外,在数据通信中,用二进制给每个字符进行编码时不得不面对的一个问题是如何使用电文总长度最短且不产生二义性。根据字符出现频率,利用赫夫曼编码可以构造一种不等长的二进制,使编码后的电文长度最短翻译 2015-04-13 22:52:15 · 704 阅读 · 0 评论 -
弗洛伊德算法(Floyd)
#define MAXVEX 9#define INFINITY 65536int Pathmatirx[MAXVEX][MAXVEX];int ShortPathTable[MAXVEX][MAXVEX];void ShortTestPath_Floyd(MGraph G,Pathmatirx *p,ShortPathTable *D){ int v,w,k; //初始化D和P翻译 2015-04-13 21:51:51 · 702 阅读 · 0 评论 -
迪杰斯特拉算法原理(Dijkstra)
迪杰斯特拉算法原理(Dijkstra)寻找最短的路径,这算法和普利姆算法类似,它是一种贪心算法,不断的寻找最优的路径!#define MAXVEX 9#define INFINITY 65536int Patharc[MAXVEX];//用于存储最短路径下标的数组int ShortPathTable[MAXVEX];//用于存储到各点最短路径的权值和void ShortTestPat翻译 2015-04-13 15:18:21 · 5841 阅读 · 0 评论 -
克鲁斯卡尔算法
克鲁斯卡尔算法(Kruskal)也是生成最小生成树的算法,和普利姆算法的目标一样,但是实现原理却不一样!普利姆算法是从顶点出发,而克鲁斯卡尔是从边出发的,在边数比较少的情况下使用克鲁斯卡尔算法是比较快速的!伪代码:int Find(int nParent[],int f){ //查找结点 while(nParent[f]>0){ f=nParent[f] } return f;翻译 2015-04-13 11:01:00 · 1431 阅读 · 0 评论 -
普利姆算法
普利姆(Prim),这个算法有什么用?在实际中这个算法经常用到电子板的电路连线中,因为可以使用到最少的连线将所有的电子连接起来,又打个比方在铺设电线将所有用户连接起来可以使用最少的电线连接起来!知道了这个作用之后你是不是比较感兴趣呢?首先看代码://Prim算法生成最小生成树void MiniSpanTree_Prim(MGraph G){ int min,i,j,k; int ad翻译 2015-04-10 17:12:23 · 747 阅读 · 0 评论 -
广度优先遍历图文说明
广度优先遍历(BreadthFirstSearch),又称广度优先搜索,简称BFS,每一个英文的首写字母!好,只说概念每一个人都模糊,所以我们以图说明,正所谓no picture you say j8!图中的数字表示遍历的过程,看到是从左往右进行宽带遍历的,正如该名称所说的一样,通过进栈和出栈实现广度优先遍历,如下图:通过两张图可以理解到了广度优先遍历的奥义吧~原创 2015-04-10 16:11:47 · 788 阅读 · 0 评论 -
拓扑排序
拓扑排序是一张AOV网(Activity Of Vertex NetWork),并且是无环的网!概念:设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列V1,V2,.......,Vn满足从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前.则我们称这样的顶点序列为一个拓扑排序序列.所谓的拓扑排序,其实就是对一个有向图构造拓扑序列的过程.概念读取来看起来还真费原创 2015-04-07 11:04:03 · 328 阅读 · 0 评论 -
插值查找算法
插值查找算法是基于二分查找算法的,只是在查找的过程中计算Middle的方式有所改变,比如一组可以通过二分查找算法计算出的nMid索引的值,是这样子计算的nMid=(nLow+nHigh)/2,但是插值查找算法是根据比率算出的,nMid=nLow +( (Key - nArr[nLow] ) / ( nArr[nHigh]-nArr[nLow] ) * (nHigh - nLow) )原创 2015-04-05 16:11:15 · 573 阅读 · 0 评论 -
平衡二叉树的实现原理
平衡二叉树引入了平衡因子BF(Balance Factor),根据平衡因子可以构造平衡二叉树以及判断该二叉树是否一棵平衡二叉树!BF的定义:二叉树上的结点上的左子树的深度值与右子树的深度值之差,如果绝对值小于等于1,表示该树是平衡二叉树!举例判断是否平衡二叉树:原创 2015-04-02 17:59:53 · 1259 阅读 · 0 评论 -
2-3-4树的构造
2-3-4树所有叶子都在同一个层次,也就是说每一层的叶子数目都是相等的,根据这个原理,我们可以将数组:7,1,2,5,6,9,8,4,3这一堆数字进行构造一棵2-3-4,上图:1.7 1 2三个数组先构造:原创 2015-03-30 17:34:26 · 2588 阅读 · 1 评论 -
2-3树的删除
2-3树所有叶子都在同一个层次,也就是说每一层的叶子数目都是相等的,如图1:1.删除的元素是叶子节点并且含有两个元素,比如删除6,直接删除即可,如图2:2.删除的元素是叶子节点并且只有1个元素的话,但是父节点的右节点函数含有两个元素,可以进行左旋转,为什么要左旋转呢,因为左边失去了平衡了,举例:删除图1的元素1的话,(6,7)进行左旋转,6的右节点保持,6的左节点等于4,如原创 2015-03-30 17:03:57 · 5885 阅读 · 1 评论 -
2-3树的插入
2-3树所有叶子都在同一个层次,也就是说每一层的叶子数目都是相等的,如图:一:插入数据3,插入的时候从根结点8发现,比8大往左走,到达4,发现比4小,继续往左走,然后发现比1大,并且此时1结点只有一个结点,所以可以插入,如图:二.插入5插入的时候从根结点8发现,比8大往左走,到达4,发现比4大,继续往右走,而6,7结点此时是满了无法插入,那么就往上找4结点,4结点可以插原创 2015-03-29 15:09:02 · 4074 阅读 · 1 评论 -
散列表的查找
为什么使用散列表?散列表在查找是有优势的,举例:1.顺序表查找:一个一个遍历查找2.有序表:可以通过二分法查找.......那散列表的查找通过一个f(value) 函数得到key就可以有对应的值了!原创 2015-03-29 11:42:05 · 772 阅读 · 0 评论 -
散列算法之散列地址取值方法
直接定址法:这个类似于数据库的关键字,比如有一个是People表,表中以年龄为关键字可以查到对应的人口数目!数字分析法:通过统计分析得出的一个结果,比如对手机号进行保存,130XXXX1234,130营运商,XXXX是所属地,1234直接用户编号,所以分析得出我们可以通过手机后4位进行散列地址平方取中法:对于不同的数如果进行平方的话再对其取其中的几位数,这样取出的数产生的重原创 2015-03-28 15:31:26 · 4397 阅读 · 0 评论 -
数据结构之散列表冲突的解决方法
//散列表查找代码实现#define HASHTABLEKEYDEFAULT 0;//键值的默认值#define HASHTABLESize 12;//表的大小#define typedef struct _HASHTABLE{int* pHash;//表地址int nCount;//表的数量}HASHTABLE,*PHASHTABLE;void InitHash(PHASHTABLE pTabl转载 2015-03-27 15:36:17 · 1008 阅读 · 0 评论