实验四二叉树的应用-哈夫曼编码(实验报告)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈夫曼编码实验四二叉树的应用-哈夫曼编码
一、实验目的
1.在二叉树基本操作的基础上,掌握对二叉树的一些其它操作的具体实现方法。
2.掌握构造哈夫曼树以及哈夫曼编码的方法。
二、实验内容
哈夫曼树和哈夫曼编码:
从终端输入若干个字符,统计字符出现的频率,将字符出现的频率作为结点的权值,建立哈夫曼树,然后对各字符进行哈夫曼编码。最后打印哈夫曼树和对应的哈夫曼编码。
设计要求:
⑴哈夫曼殊和哈夫曼编码的存储表示参考教材事例
⑵在程序中构造四个子程序为
①int freqchar(char *text, HTree *t) /*统计字符出现的频率*/
②int createhtree(HTree *t) /*根据字符出现的频率建立哈夫曼树*/
③void coding(HTree *t,int head_i,char *code)
/*对哈夫曼树进行编码*/
④void printhtree(HTree *t,int head_i,int deep,int* path)
/*中序打印树*/
三、实验步骤
㈠、数据结构与核心算法的设计描述
# include
# include
# include
# include
# include
# define MAX_LENGTH 100
typedef char **HuffmanCode;
typedef struct //define structure HuffmanTree {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
㈡、函数调用及主函数设计
④
㈢程序调试及运行结果分析
㈣实验总结
哈弗曼编码输入抽象数据类型,不易掌握,需要慢慢修改。
四、主要算法流程图及程序清单
1、主要算法流程图:
void Select(HuffmanTree HT,int i,int &s1,int &s2)
void HuffmanCoding(HuffmanTree &HT,HuffmanCode&HC,int *w,int n)
2、程序清单
哈夫曼转化函数::
void Select(HuffmanTree HT,int i,int &s1,int &s2)
{
int j,k=1;
while(HT[k].parent!=0)
k++;
s1=k;
for(j=1;j<=i;++j)
if(HT[j].parent==0&&HT[j].weight s1=j; k=1; while((HT[k].parent!=0||k==s1)) k++; s2=k; for(j=1;j<=i;++j) if(HT[j].parent==0&&HT[j].weight } void HuffmanCoding(HuffmanTree &HT,HuffmanCode&HC,int *w,int n) { int m,i,s1,s2,start,c,f; HuffmanTree p; if(n<=1) return; m=2*n-1; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(p=HT+1,i=1;i<=n;++i,++p,++w) { p->weight=*w; cout< p->parent=0; p->lchild=0;//初始化哈夫曼树 p->rchild=0; } for(;i<=m;++i,++p) //initial HT[n+1...2*n1] { p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; } cout< for(i=n+1;i<=m;++i) { Select(HT,i-1,s1,s2); //s1 is the least, s2 is the second least HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; cout< for(i=1;i<=n;++i) { start=n-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((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); printf("\nHT[%d] 节点的哈夫曼编码是: %s",i,HC[i]); } cout< free(cd);