实验四二叉树的应用-哈夫曼编码(实验报告)

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

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);

相关文档
最新文档