#include
struct node
{
int weight;
int parent,lch,rch;
};
int n;
creat_huff(struct node Htree[]);
code_huff(struct node Htree[]);
creat_huff(struct node Htree[])
{
int i,j,min1,min2,min11,min22;
printf("请输入叶子的结点个数:");
scanf("%d",&n);
for(i=0;i<2*n-1;i++)
{
Htree[i].parent=-1; //数组Htree的初始化
Htree[i].lch=-1;
Htree[i].rch=-1;
}
for(i=0;i<n;i++)
{
printf("输入第%d个叶节点的权值:",i);
scanf("%d",&Htree[i].weight); //叶子的权值赋值到Htree数组中
}
for(i=n;i<2*n-1;i++)
{
min1=min2=10000;
min11=min22=0; //用min1,min2记录最小的权值;min11.min22记录位置;
for(j=0;j<i;j++)
{
if(Htree[j].parent==-1)
if(Htree[j].weight<min1) //当权值比最小值还要小的时候,最小值赋给次小值,权值赋给最小值。
{ min2=min1;
min22=min11;
min11=j;
min1=Htree[j].weight;
}
else
if(Htree[j].weight<min2)
{
min22=j;
min22=Htree[j].weight;
}
}
Htree[min11].parent=i; //设置最小值和次小值的parent域
Htree[min22].parent=i; //设置新的parent,lch,rch
Htree[i].weight=Htree[min11].weight+Htree[min22].weight;
Htree[i].lch=min11;
Htree[i].rch=min22;
}
Htree[2*n-2].parent=-1;
}
code_huff(struct node Htree[])
{
int i,j,k,pr,start;
char code[50][50];
for(i=0;i<n;i++)
{
j=n-2;
k=i;
while (Htree[k].parent!=-1)
{
pr=Htree[k].parent; //记录父结点
if(k==Htree[pr].lch)
code[i][j]='0'; //左孩子编码为0,右编码为1
else
code[i][j]='1'; //编码存进数组里
j=j-1;
k=pr; //从叶结点逐渐到根结点
pr=Htree[k].parent;
code[i][n-1]=j+1;
}
printf("编码为:\n");
for(i=0;i<n;i++)
{
printf("第%d个哈夫曼编码是:",i);
start=code[i][n-1];
for(j=start;j<n-1;j++);
printf(" %d",code[i][j]);
printf("\n");
}
}
}
main()
{
int i,j,k,pr,start;
char code[50][50];
struct node Htree[20];
creat_huff(Htree);
printf("\n weight parent lch rch\n");
for (i=0;i<2*n-1;i++)
{printf(" %-6d%-8d%-5d%-5d\n",Htree[i].weight,Htree[i].parent,Htree[i].lch,Htree[i].rch);
}
code_huff(Htree);
}