实验六 最优二叉树的应用

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

}

相关文档
最新文档