![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构基础复习
在摸索中前进
计算机软件的入门水平,希望不断进步。
展开
-
数据结构基础排序算法
1、冒泡 2、选择 3、插入 4、快速 5、归并原创 2016-04-14 21:47:57 · 2330 阅读 · 0 评论 -
霍夫曼树和霍夫曼编码原理
一、哈夫曼树的概念和定义 什么是哈夫曼树?让我们先举一个例子。判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: [cpp] view plain copy转载 2016-04-10 20:20:59 · 23852 阅读 · 3 评论 -
构造霍夫曼树代码
首先需要构造霍夫曼树的节点。package tree;public class Node { // 属性的限定符全为public,为了编程方便,不推荐这样用 // 权值必须有,数据(节点名)不必要 public char data; public int weight; public Node lchild; public Node rchild;原创 2016-04-10 20:11:46 · 3400 阅读 · 0 评论 -
最小堆和最小堆排序
1、原理介绍:百度百科 2、最小堆的构造和添加#include <stdio.h>#define N 9 // 最小堆得元素个数int minHeap[N]; // 存放最小堆的数组int index1 = 0; // 最小堆数组索引void add(int d) // 向最小堆内添加数据{ if(index1 >= N) { printf("Out of r原创 2016-04-13 14:28:10 · 9052 阅读 · 0 评论 -
LZW压缩算法
压缩步骤: 1、初始化字典。使用链表初始化256个节点。节点存储编码、字符串、指针数据。编码为0-255(对应ASCII的单个字符)。如果被压缩对象中仅有有限几个字符时,可以自定义范围。例如对文本abaabbaab压缩,仅有a b两个字符,那么字典初始为{a=0,b=1}。2、需要用到的几个变量String prefix,suffix,word;每次从文本中读取一个字符,赋值给suffix, pr原创 2016-04-12 22:13:40 · 2549 阅读 · 0 评论 -
霍夫曼编码和解码
编码步骤: 1、准备待编码的字符串(可以从文本文件中读取不包含中文)。 2、统计字符串中每个字符出现的次数。(设置一个长度为256的数组,使用字符对应的ASCII码作为数组下标,保存次数。如:array[‘a’]=10;表示字符a出现10次。) 3、根据上面的数组,生成节点。(每个字符对应一个节点,以链表形式链接起来,同时链表按从小到大排序。) 4、构造霍夫曼树。每次删除链表中的两个节点,生原创 2016-04-11 16:05:23 · 8182 阅读 · 0 评论 -
二叉树还原成普通树
transform方法流程: 1、构造两个队列,普通树队列和二叉树队列。 2、将二叉树的根入队列,构造普通树的根顶点并入对应队列。 3、循环判断二叉树队列不为空。 4、从两个队列中分别取出一个元素,分别为bnode,node。 5、当bnode没有左孩子时,不考虑这种情况。因为此时的node没有孩子。 6、当bnode有左孩子时,构造普通树节点,数据为左孩子的数据。将该普通节点和左孩子分原创 2016-04-07 20:49:53 · 4941 阅读 · 0 评论 -
队列实现二叉树的层序遍历
首先定义队列的结构体和方法。队列使用二维指针保存指向树节点的指针。i,j为指向队列开头、结尾元素的游标。struct QueueBTree{ int i, j; BTreeNode **queue; //存放的指针类型};typedef struct QueueBTree QueueBTree;QueueBTree * initQueueBTree(){ //分配一个原创 2016-04-07 14:41:37 · 4374 阅读 · 0 评论 -
非递归实现前序、中序、后序遍历
下面的三组遍历均需要使用到栈,此处给出栈的简单定义,使用数组保存数据。使用数的节点时,传递的都是点对应的数组索引。(是i不是a[i])//定义栈及其方法struct Stack{ int a[N]; //存入栈元素,N为二叉树的点个数 int top; //栈顶指针};typedef struct Stack Stack;void addStack(Stack *s, int原创 2016-04-07 14:24:59 · 3046 阅读 · 0 评论 -
使用栈实现DFS(非递归DFS)
图片摘自:点击打开链接#include #include #define N 4 //定义图中点个数int a[N][N] = {{-1,1,1,-1},{1,-1,-1,1},{1,-1,-1,1},{-1,1,1,-1}}; //邻接矩阵,-1无边int label[N] = {0}; //标记数组,0未标记//定义栈及其方法struct Stack{原创 2016-04-07 12:57:01 · 28421 阅读 · 3 评论 -
树、森林与二叉树相互转化原理图
1、树转换为二叉树由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号。将树转换成二叉树的步骤是:(1)加线。就是在所有兄弟结点之间加一条连线;(2)抹线。就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线;(3)旋转。就是以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。转载 2016-04-07 11:52:46 · 46389 阅读 · 9 评论 -
普通树转化成二叉树
普通树转化成二叉树。原创 2016-04-04 21:11:25 · 7291 阅读 · 0 评论 -
二叉树的遍历
1、前序遍历(父节点,左孩子,右孩子)。#define N 7 //树节点个数int tree[N]={a,b,c,d,e,f,g}; //自定义节点编号void foreIterator(int root){ if(root >= N) return; printf("%d ",tree[root]); //这里可以替换成自己的处理函数 foreIter原创 2016-04-04 21:02:47 · 2303 阅读 · 0 评论 -
图的最短路径
求最短路径常用算法Dijkstra和Floyd。1、Dijksta算法 a、首先标记起点。 b、然后循环遍历所有点,如果这个点没被标记,距起点较近,那么用一个变量u记录该点,重复这个过程,保证u点为距离起点最近而且没有被标记的点。 c、标记u点。 d、重新计算u的未标记邻接点v距离起点的最近距离。需要比较该邻接点v距起点的距离与u与起点距离加上边u,v的权重的大小。取较小者。 f、重复b原创 2016-04-02 16:32:22 · 2613 阅读 · 0 评论 -
图的遍历
1、DFS(Depth-First-Search深度优先搜索) 从选定的顶点开始,开始递归遍历。递归的思想:标记起点,找到第一个邻接点,如果该点没标记,那么以该点为新起点进行递归。如果改点标记或者上一个邻接点递归完毕,寻找下一个邻接点重复上面过程。算法如下:void dfs(int start, int label[]){ label[start] = 1; // 标记该点 in原创 2016-04-01 15:51:07 · 2361 阅读 · 0 评论 -
图的存储结构
1、邻接矩阵。使用二位数组存储。 2、邻接表。使用链表存储。每个顶点拥有自己的链表,链表存储该顶点 的邻接点。如果是有向图,链表节点个数表示该顶点的出度。 3、逆邻接表。使用链表存储。通常针对有向图,与邻接表相反,链表节点个数表示该顶点的入度。 4、十字链表,邻接表与逆邻接表的结合。适用于有向图/稀疏矩阵,方便求顶点的出度和入度。有点节点、边节点,结构体定义如下:struct VNode{原创 2016-04-01 15:10:48 · 2557 阅读 · 0 评论 -
图的最小生成树
针对无向图,而且图必须联通。最小生成树是指保持图的联通性的基础上保留n-1条边,裁剪掉其它边,保证留下来的边的权值总和最小而且不可以存在环路(裁剪原则)。通常有Prim算法和Kruskal算法。其中Prim算法时间复杂度为O(n^2),适合稠密图;Kruskal算法时间复杂度为O(e*lge),与边的条数有关,适合稀疏图。当图的各个边权值不同时,最小生成树唯一1、Prim算法 1).输入:一个加权原创 2016-04-01 16:44:51 · 2746 阅读 · 0 评论