实验 四 哈夫曼树及其的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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*));

相关文档
最新文档