哈弗曼树
代码如下:
#include<stdio.h>
#include<string.h>
#define N 50
#define M 2*N-1
#define INF 32767 //定义无穷大INF
typedef struct
{
char data[5];
int weight;
int parent,lchild,rchild;
}htnode;
//min1和min2为最小权重的两个结点位置
void Selectmin(htnode ht[],int *min1,int *min2,int pos1,int pos2)
{
int k,m1,m2;
m1=m2=INF;
for(k=pos1;k<=pos2;k++)
{
if(ht[k].parent==-1)
{
if(ht[k].weight<m1)
{
m2=m1;
*min2=*min1;
m1=ht[k].weight;
*min1=k;
}
else if(ht[k].weight<m2)
{
m2=ht[k].weight;
*min2=k;
}
}
}
}
void createht(htnode ht[],int n)
{
int i;
int min1,min2;
for(i=0;i<2*n-1;i++)
{
ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
}
for(i=n;i<2*n-1;i++)
{
Selectmin(ht,&min1,&min2,0,i-1);
ht[min1].parent=i;
ht[min2].parent=i;
ht[i].weight=ht[min1].weight+ht[min2].weight;
ht[i].lchild=min1;
ht[i].rchild=min2;
}
}
void main()
{
htnode ht[N];
int m;
printf("输入结点的个数:");
scanf("%d",&m);
printf("哈弗曼树的创建:\n");
createht(ht,m);
}