数据结构
文章平均质量分 71
jessica1201
这个作者很懒,什么都没留下…
展开
-
二叉树的非递归后序遍历
1、第一种方法非递归后序遍历二叉树比非递归先序、中序遍历二叉树稍微复杂一点。因为后序遍历的顺序为:左子树、右子树、根,因此除了要利用栈来保存需要回溯的元素之外还要设置一个能表示何时能访问根节点的标志。栈中要保存的数据是一个结构体;包含指向二叉树根节点的指针和访问标志。#include#define ERROR -1;#define OK 1;typedef char Verte原创 2012-09-26 11:40:23 · 756 阅读 · 0 评论 -
prim算法构造最小生成树(邻接表和数组两种存储方式实现)
最小生成树问题简单地说就是在有N个结点的图中寻找能连接n个结点的n-1条边,使总的代价最小。构造构造最小生成树有两个典型的算法,prim算法和Kruskal算法。prim算法思想:假设N={V,{E}}是联通网,TE是N上最小生成树中边的集合。算法从U={u}(u在v中),TE={}开始,重复执行以下操作:在所有的U和V中相连接的边中寻找一条代价最小的边(u,v)加入TE中,同时将u加原创 2012-09-28 09:37:16 · 6333 阅读 · 1 评论 -
构建赫夫曼树,并输出节点编码
赫夫曼树又称最优二叉树,是带权路径长度最小的二叉树。对应于赫夫曼树有相应的赫夫曼编码,赫夫曼编码有非常大的用途,例如,拍电报时,我们希望传送的字符的编码总长度最小,因此,我们可以为出现频度最大的字符赋予较短的编码,对于出现频度较小的字符赋予较长的编码。构造赫夫曼树以及对叶子节点进行编码的完整代码如下:#include#includeusing namespace std;t原创 2012-09-14 11:09:45 · 782 阅读 · 0 评论 -
递归深度优先遍历图(DFS)(邻接表和数组两种方式)
图的深度优先遍历(DFS)类似于树的先根遍历,它是树的先根遍历的推广。图的存储结构有:数组、邻接表、十字链表、邻接多重表1、以下程序实现用邻接表存储图,并实现图的深度优先遍历(递归)方法 #includeusing namespace std;typedef char VertexType; //使用此方式定义顶点类型,在需要更改顶点类型时不需要在整个程序中更改,只原创 2012-09-19 10:48:43 · 2680 阅读 · 0 评论 -
直接插入排序
直接插入排序的思想很简单,即在一个已经排好序的有序表中插入一个新的记录,得到一个新的、记录数增1的有序表。在以下程序中设立了一个哨兵ivec[0],为了防止数组访问越界。因为在编译时数组下标越界不会提示出错,因此此处设一个哨兵位,防止越界。空间复杂度:需要一个记录的辅助空间,o(1)时间复杂度:直接插入排序的基本操作为比较和移动数据。含有N个记录的序列,最优情况下需比较N-1次,不需移原创 2012-10-10 15:56:14 · 304 阅读 · 0 评论 -
冒泡排序
冒泡排序是借助“交换”进行排序的方法冒泡排序的排序方式可以有多种,可以将序列中最小的元素“上升到水面”,也可以将序列中最大的元素“沉到水底”,也可以将最小的元素放到水底。。。具体方式依个人喜好而定。冒泡排序的思想非常简单:1、将序列中第一个记录的关键字和第二个记录的关键字比较,若为逆序,则交换顺序;比较第二个记录的关键字和第三个记录的关键字的大小,若为逆序则交换顺序。。。依次进行上述操原创 2012-10-12 11:17:47 · 425 阅读 · 0 评论 -
归并排序(2-路归并排序)
归并是指将两个或两个以上的有序表组合成一个新的有序表。归并排序思想:对于含有n个记录的序列,可以看成是n个有序的子序列,每个子序列的长度为1,然后两两合并,得到N/2(上取整)个有序的含有两个记录的子序列,重复以上合并过程,直到得到一个含有N个记录的序列为止。对初始序列进行分割得到含有一个记录的子序列的过程可以看做是从根到叶子构建二叉树的过程;对有序的子序列进行合并的过程可以看做是从叶子到原创 2012-10-16 14:45:32 · 1518 阅读 · 0 评论 -
堆排序
堆排序的思想:1、首先把待排序的n个记录构造成大顶堆2、把堆顶元素与数组中中最后一个元素交换3、把剩下的n-1个记录调整成大顶堆,并执行2过程4、对剩下的元素重复执行过程3,直到最后1个元素为止堆排序只需要一个记录的辅助空间,最坏情况下的时间复杂度为o(NlogN)。堆排序对于记录数较少的文件不值得提倡,但是对于n较大的文件还是很有效的。得到正序序列可以1、构建大顶堆,排序原创 2012-10-16 20:12:56 · 375 阅读 · 0 评论 -
非递归中序遍历二叉树
1、二叉树的非递归中序遍历二叉树的非递归中序遍历要用到栈,思想很简单不在赘述,一下给出完整代码#include#define ERROR -1;#define OK 1;typedef char VertexType;typedef struct BinNode{ VertexType data; struct BinNode *lchild,*rchild;}原创 2012-09-24 16:58:11 · 599 阅读 · 0 评论 -
非递归先序遍历二叉树
非递归先序遍历二叉树由于要用到回溯,因此需要保存已访问过的根节点的指针。可以用栈来保存已访问过的根节点的指针,用于回溯。代码如下#include #define OK 1;#define ERROR -1;typedef char VertexType;using namespace std;typedef struct BinNode{ VertexType da原创 2012-09-25 10:43:12 · 1074 阅读 · 0 评论 -
希尔排序(缩小增量排序)
希尔排序又称缩小增量排序,它是对直接插入排序的改进。由直接插入排序可知,其算法时间复杂度为O(N*N),而当待排序的序列为正序时,算法时间复杂度为O(N)。因此可知当待排序的序列中记录按关键字基本有序时,就可以提高直接插入排序的效率。希尔排序的思想为:将待排序列划分成几个子序列,分别对子序列进行直接插入排序,待整个序列中的记录基本有序时在对整个记录进行一次直接插入排序。子序列划分方法:将相原创 2012-10-15 19:25:31 · 583 阅读 · 0 评论 -
构建二叉树并实现递归遍历
二叉树的递归遍历相当简单,以下代码实现由先序ABDFEGHC,中序DFBGEHAC确定的二叉树,并实现递归的遍历,执行程序时输入ABD#F##EG##H##C###includeusing namespace std;typedef struct BinNode{ char data; BinNode *lchild,*rchild;}bin_tree,*tre原创 2012-09-10 17:25:27 · 319 阅读 · 0 评论 -
已知二叉树先序、中序(中序、后序)遍历序列,输出后序(先序)遍历序列
1、已知二叉树的先序遍历序列为A B D F E G H C,中序遍历序列为D F B G E H A C,构建二叉树并输出二叉树的后序遍历序列。思想:先序遍历二叉树的顺序为 根 左子树 右子树中序遍历二叉树的顺序为 左子树、根、右子树;首先根据二叉树的先序遍历序列确定二叉树的根,再根据中序遍历序列确定二叉树的左子树和右子树,再递归的对左子树和右子树进行以上操作。代码如下:原创 2012-09-09 19:36:56 · 2300 阅读 · 0 评论 -
分层遍历二叉树
分层遍历二叉树的思想特别简单1、遍历根节点2、若根节点的左孩子和右孩子不空,则遍历左孩子和右孩子(从左到右的遍历,如果为从右到左的遍历,只需将遍历左右孩子的顺序颠倒即可)3、重复以上过程知道二叉树中所有的结点均遍历完为止二叉树的分层遍历可以使用队列来完成,在队列中保存指向二叉树结点的指针比直接保存二叉树结点的数据简单的多。思想为:1、指向二叉树根节点的指针入队2、若队不为空原创 2012-09-24 11:20:28 · 616 阅读 · 0 评论 -
快速排序
快速排序是对冒泡排序的一种改进。思想为:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字都比另一部分记录的关键字小,继续对这两部分记录的关键字尽心排序,直到整个序列有序。在一趟排序过程中,找一个枢轴(通常选第一个元素),将所有小于它的记录都安置在它的位置之前,将所有大于它的记录都安置在它的位置之后,然后递归的对左半部分序列和右半部分序列进行排序。#include#inc原创 2012-10-13 16:50:58 · 223 阅读 · 0 评论 -
折半插入排序
折半插入排序是对直接插入排序的改进,他们都是插入排序。由于插入排序的基本操作是查找和插入,因此“查找”可用折半查找来实现。空间复杂度:o(1)时间复杂度:折半插入排序仅仅减少了关键字比较的次数,记录移动的次数不变,因此时间复杂度仍为o(N*N)#include#includeusing namespace std;void BInsertSort(vector &ive原创 2012-10-10 16:52:43 · 515 阅读 · 0 评论 -
2-路插入排序
2-路插入排序是在折半插入排序的基础上进行的改进,目的是减少排序过程中记录移动的次数。算法的思想为:另设一个和原始待排序列L相同的数组D,首先将L[1]复制给D[1],并把D[1]看成是已排好序的序列中处于中间位置的元素,之后将L中的从第二个元素开始依次插入到数组D中,大于D[1]的插入到D[1]之后的序列(此处我称为右半边序列,用的是数组左半部分空间),小于D[1]的插入到D[1]之前的序列原创 2012-10-11 16:53:58 · 4068 阅读 · 0 评论 -
Kruskal算法构造图的最小生成树
Kruskal算法的思想是:假设联通网T=(V,{E}),则最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点位于不同的连通分量中,则将该边加入T中,否则舍去该边而选择下一条代价最小的边。一次类推,直到T中所有的顶点都在同一个连通分量为止。以下给出代码:1、用数组实现,指定图的结点数和弧数#in原创 2012-10-09 22:10:37 · 1341 阅读 · 0 评论 -
图的广度优先遍历(邻接表存储)
图的广度优先搜索类似于树的按层遍历,遍历过程中要用到队列(因为队列中的元素为先进先出),BFS的思想很简单,以下给出完整的代码#include typedef char InfoType;typedef char VertexType;typedef char QElemType;#define ERROR -1;#define OK 1;bool visited[20原创 2012-09-21 15:30:10 · 1713 阅读 · 0 评论