实验四 哈夫曼树的建立

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

09级信管专业01班学号0902011392012年5月25日

姓名黄涛指导老师杨明欣

实验名称哈夫曼树的建立

一、实验目的:

1.理解哈夫曼树及其应用。

2.掌握生成哈夫曼树的算法。

二、实验内容:

哈夫曼树,即最优树,是带权路径长度最短的树。有着广泛的应用。在解决某些判定问题上,及字符编码上,有着重要的价值。

构造一棵哈夫曼树,哈夫曼最早给出了算法,称为哈夫曼算法:

(1)根据给定的N个权值W1,W2,W3,……,Wn ,构成N棵二叉树的集合F= T1,T2,T3,……,Tn ,其中每棵二叉树T1只有一个带权为WI的根结点,其左右子树均空。

(2)在F中选出两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的权值为其左右子树上的根结点的权值之和。

(3)在F中删除这两棵树,同时将新得到的加到F之中。重复(2)和(3),直至F 中只剩一个为止。

三、程序流程图

四、程序代码

#include"stdio.h"

#define LEN sizeof(struct HTnode)

int i,l,n,w=0,c,start,a1,a2,f;

struct HTnode {unsigned int weight;

unsigned int parent,lchild,rchild;

}*p,*HT;

typedef char **Huffmancode;

Huffmancode HC;

char *cd;

select()

{int k=1,j,flag=0;

while((HT+k)->parent!=0) k++;

for(j=k+1;j<=n;j++,flag=0)

{if((HT+j)->parent!=0) flag=1;

if((HT+j)->weight==0) flag=1;

if(!flag) {if((HT+j)->weight<(HT+k)->weight) k=j;}

}

return(k);

}

main()

{printf("\n赫夫曼树的建立:\n");

printf("请输入权值(叶子)数目:");

scanf("%d",&l);

while(l<1) {printf("输入错误,请重新输入权值数目:");

scanf("%d",&l); }

if(l==1) printf("\n只有一个权值,无须建立赫夫曼树!");

else {n=2*l-1;

HT=(struct HTnode*)malloc((n+1)*LEN);

printf("请按对应顺序输入权值(输入一权值,键入一回

车):\n");

for(i=1,p=HT+1;i<=l;++i,++p)

{scanf("%d",&w);

while(w<=0){printf("权值错,重新输入此权值:"); scanf("%d",&w);}

p->weight=w; p->parent=0;

p->lchild=0; p->rchild=0;

}

for(i=l+1;i<=n;++i,++p)

{p->weight=0; p->parent=0;

p->lchild=0;

}

for(i=l+1;i<=n;++i)

{a1=select(); (HT+a1)->parent=i;

a2=select(); (HT+a2)->parent=i;

(HT+i)->lchild=a1;

(HT+i)->rchild=a2;

(HT+i)->weight=(HT+a1)->weight+(HT+a2)->weight;

}

HC=(Huffmancode)malloc((l+1)*sizeof(char *));

cd=(char *)malloc(l*sizeof(char));

*(cd+(l-1))='\0';

for(i=1;i<=l;++i)

{start=l-1;

for(c=i,f=(HT+i)->parent;f!=0;c=f,f=(HT+f)->parent)

if((HT+f)->lchild==c) *(cd+(--start))='0';

else *(cd+(--start))='1';

*(HC+i)=(char *)malloc((l-start)*sizeof(char));

strcpy(*(HC+i),(cd+start));

}

printf("\n对应的二进制赫夫曼编码为:\n");

for(i=1;i<=l;++i)

{printf("%s",*(HC+i));

printf(" ");

}

}

}

五、实验结果截图

六、思考题目

举一实例说明哈夫曼树的用途。

答:在数据通讯中,经常需要将传送的文字转换成由二进制字符0,1组成的二进制串,我们称之为编码。例如对于进行快速远距离的通信电报,各个字符出现和使用的频度是不相同的,通常希望出现频率高的字符采用尽可能短的编码,出现频率低的字符采用稍长的编码,从而缩短电文的总长度。

七、上机体会

本次上机我基本掌握了哈夫曼树的算法及其在实际中的应用,感觉哈夫曼树的用途不可小觑。

相关文档
最新文档