实验 四 哈夫曼树及其的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数
据
结
构
实
验
报
告
(四)
姓名: 李 大 宝 学院:计算机学院 班级:软件
114班
实验四哈夫曼树及其的应用
一、实验目的
1.在二叉树基本操作的基础上,掌握对二叉树的一些其它操作的具体实现方法。
2.掌握构造哈夫曼树以及哈夫曼编码的方法。
3、熟练掌握哈夫曼树(最优二叉树)特征及其应用
二、实验内容
题目一、哈夫曼树和哈夫曼编码:
从终端输入若干个字符,统计(或指定)字符出现的频率,将字符出现的频率作为结点的权值,建立哈夫曼树,然后对各字符进行哈夫曼编码。最后打印哈夫曼树和对应的哈夫曼编码。
设计要求:
哈夫曼殊和哈夫曼编码的存储表示参考教材事例。
/*定义常量和类型*/
#define MAX 1000000.00 //宏定义定义常量MAX typedef char* CHAR; //定义char* 类型的变量CHAR typedef double* DOUBLE; //定义double*类型的变量DOUBLE
/* 定义赫夫曼树结点类型 */
typedef struct
{double weight;//权值(字符频度)类型为double
int parent,lchild,rchild;//左孩子右孩子双亲类型为int
char s;//存放字符信息
}HTNode,*HuffmanTree;
typedef char **HuffmanCode; //存放赫夫曼编码
在程序中构造六个子程序为
a)int freqchar(char *text,DOUBLE &b,CHAR &c)
/*统计字符出现的频率*/
b)void createhtree(HuffmanTree &HT,double *w,char *str,int n)
/*根据字符出现的频率建立哈夫曼树*/
c)void coding(HuffmanTree HT,HuffmanCode &HC,int n)
/*对哈夫曼树进行编码*/
d)void printHTree(HuffmanTree &HT,int n,int deep)
/*中序打印树*/
e)void Select(HuffmanTree &t,intn,int&s1,int &s2)
/*选择出两个权值最小的*/
f)int Min(HuffmanTree t,int n)
/*找出权值最小*/
相关函数的实现:
a)/*统计字符出现的频率*/ //c为存放字符的字符数组int freqchar(char *text,DOUBLE &b,CHAR &c)//b为频度的数组{int k=0;//统计一共有几种字符,最后返回
int a[26],i,j=0,t,n=strlen(text);
for(i=0;i<26;i++)a[i]=0;
for(i=0;i for(i=0;i<26;i++)if(a[i]!=0)k++; //如果a[i]!=0表示该处字符存在,所以字符的种树加一b=new double[k];c=new char[k];//为b、c申请内存 for(i=0;i<26;i++)//求出字符出现的频度和每个字符是哪一个if(a[i]!=0){t=j++;b[t]=a[i]/(n*1.0);c[t]='a'+i;} return k;//返回一共有多少字符。 } b) /*根据字符出现的频率建立哈夫曼树*/ 参数:赫夫曼树HT,频度数组*w,字符数组*str,字符个数n void createhtree(HuffmanTree &HT,double *w,char *str,int n) { int m,i,s1,s2;HuffmanTree p; if(n<=1)return; //n<=1退出建立哈夫曼树m=2*n-1; //构造赫夫曼树需要建立至少2*n-1个节点HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //一共申请2*n个节点,第一个节点不用for(p=HT+1,i=1;i<=n;++i,++p,++w,++str) {(*p).weight=*w;(*p).parent=0; //对前几个进行初始化 (*p).lchild=0; (*p).rchild=0;(*p).s=*str; }//对前n个进行初始化,赋给它们权值,并把左右孩子双亲赋为0 for(;i<=m;++i,++p)(*p).parent=0;//最后几个只需双亲赋为0 for(i=n+1;i<=m;++i) //建立赫夫曼树 { Select(HT,i-1,s1,s2);//选择两个最小的向上建立赫夫曼树HT[s1].parent=HT[s2].parent=i;//把两个最小的双亲赋为i HT[i].lchild=s1;HT[i].rchild=s2;//它的左右孩子赋值为s1,s2 HT[i].weight=HT[s1].weight+HT[s2].weight; }} //它的权值为s1,s2的权值相加c) /*对哈夫曼树进行编码*/ void coding(HuffmanTree HT,HuffmanCode &HC,int n) {int c,f,start,i;char *cd; //临时存放赫夫曼编码HC=(HuffmanCode)malloc((n+1)*sizeof(char*));