实验六 最优二叉树的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六最优二叉树的应用
【实验目的】
掌握求最优二叉树的方法。
【实验内容】
最优二叉树在通信编码中的应用。要求输入一组通信符号的使用频率
{2,3,5,7,11,13,17,19,23,29,31,37,41},求各通信符号对应的前缀码。
【实验原理和方法】
(1)用一维数组f[N]存贮通信符号的使用频率,用求最优二叉树的方法求得每个通信符号的前缀码。
(2)用链表保存最优二叉树,输出前缀码时可用树的遍历方法。
#include
#include
#define N 13
struct tree {
float num;
struct tree *Lnode;
struct tree *Rnode;
}* fp[N];//保存结点
char s[2*N];//放前缀码
void inite_node(float f[],int n)//生成叶子结点
{
int i;
struct tree *pt;
for(i=0;i { pt=(struct tree *)malloc(sizeof(struct tree));//生成叶子结点 pt->num=f[i]; pt->Lnode=NULL;pt->Rnode=NULL; fp[i]=pt; } } void sort(struct tree * array[],int n)//将第N-n个点插入到已排好序的序列中。 { int i; struct tree *temp; for(i=N-n;i if(array[i]->num>array[i+1]->num) { temp=array[i+1]; array[i+1]=array[i]; array[i]=temp; } } struct tree * construct_tree(float f[],int n)//建立树 { int i; struct tree *pt; for(i=1;i { pt=(struct tree *)malloc(sizeof(struct tree));//生成非叶子结点 //第一句 pt->Lnode=fp[i-1]; //第二句 fp[i]=pt;//w1+w2 sort(fp,N-i); } return fp[N-1]; } void preorder(struct tree *p,int k,char c) { int j; if(p!=NULL) { if(c=='l') s[k]='0'; else s[k]='1'; if(p->Lnode==NULL) {//P指向叶子 printf("%.2f: ",p->num); for(j=0;j<=k;j++) printf("%c",s[j]); putchar('\n'); } //第三句 //第四句 } } void main(){ float f[N]={2,3,5,7,11,13,17,19,23,29,31,37,41}; struct tree *head; //第五句-初始化结点 head=construct_tree(f,N);//生成最优树 s[0]=0; preorder(head,0,'l');//遍历树 }