构造哈夫曼树
(1)算法描述
建立哈夫曼树时,将哈夫曼树的结构定义为一个结构型的一维数组,每个元素含有四项:双亲、左孩子、右孩子。给定的权值可以从键盘输入,要输出所建立的哈夫曼树,只
要输出哈夫曼树的一维数组中全部元素即可。
(2)对应代码
#include<stdio.h>
#include<malloc.h>
#define maxval 10000.0
#define maxsize 100
typedef struct
{
char ch;
float weight;
int lchild,rchild,parent;
}hufmtree;
typedef struct
{
char bits[10];
int start;
char ch;
}codetype;
void huffman(hufmtree tree[],int n,int m);
void huffmancode(codetype code[],hufmtree tree[],int n);
int main()
{
int choice=0;
int n,m;
int i,j;
hufmtree *tree;
codetype *code;
printf("请输入元素个数:");
scanf("%d",&n);
m=2*n-1;
tree=(hufmtree *)malloc(sizeof(hufmtree)*m);
code=(codetype *)malloc(sizeof(codetype)*n);
huffman(tree,n,m);
printf("哈夫曼树已成功建立!\n");
huffmancode(code,tree,n);
printf("输出哈夫曼编码\n");
for(i = 0;i<n;i++)
{
printf("%c: ",code[i].ch);
for(j = code[i].start;j < n;j++)
printf("%c ",code[i].bits[j]);
printf("\n");
}
return 0;
}
void huffman(hufmtree tree[],int n,int m)
{
int i,j,p1,p2;
float small1,small2,f;
char c;
for(i=0;i<m;i++)
{
tree[i].parent=0;
tree[i].lchild=-1;
tree[i].rchild=-1;
tree[i].weight=0.0;
}
for(i=0;i<n;i++)
{
printf("输入第%d个元素的=>\n",i+1);
printf("\t结点值:");
scanf("%c",&c);
tree[i].ch=getchar();
printf("\t权值:");
scanf("%f",&f);
tree[i].weight=f;
}
for(i=n;i<m;i++)
{
p1=0;p2=0;
small1=maxval;small2=maxval;
for(j=0;j<i;j++)
if(tree[j].parent==0)
if(tree[j].weight<small1)
{
small2=small1;
small1=tree[j].weight;
p2=p1;
p1=j;
}
else
if(tree[j].weight<small2)
{
small2=tree[j].weight;
p2=j;
}
tree[p1].parent=i;
tree[p2].parent=i;
tree[i].lchild=p1;
tree[i].rchild=p2;
tree[i].weight=tree[p1].weight+tree[p2].weight;
}
}
void huffmancode(codetype code[],hufmtree tree[],int n)
{
int i,c,p;
codetype cd;
for(i=0;i<n;i++)
{
cd.start=n;
cd.ch=tree[i].ch;
c=i;
p=tree[i].parent;
while(p!=0)
{
cd.start--;
if(tree[p].lchild == c)
cd.bits[cd.start] = '0';
else
cd.bits[cd.start] = '1';
c = p;
p = tree[p].parent;
}
code[i]=cd;
}
}
(3)运行结果