#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAXNUM 60
typedef struct
{
int weight;
int parent;
int lchild;
int rchild;
}HTNode,*huffmantree;
void Select(huffmantree HT, int g, int &s1, int &s2);
//输入叶子的权值,并输出所有的权值
void creattree(huffmantree &HF,int n)
{
int i,m;
if(n<=1) return;
m=2*n-1;
HF=(huffmantree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=m;++i)
{
HF[i].parent=0;
HF[i].lchild=0;
HF[i].rchild=0;
}
printf("输入叶子权值\n");
for(i=1;i<=n;++i)
{
scanf("%d",&HF[i].weight);
}
for(i=n+1;i<=m;++i)
{
int g,s1,s2;
Select(HF,i-1,s1,s2);
HF[s1].parent=i;
HF[s2].parent=i;
HF[i].lchild=s1;
HF[i].rchild=s2;
HF[i].weight=HF[s1].weight+HF[s2].weight;
}
printf("输出权值\n");
for(i=1;i<=m;i++)
printf("%d ",HF[i].weight);
printf("\n");
}
//Select函数找两个最小值
void Select(huffmantree HT, int g, int &s1, int &s2)
{
int j, k, m, n;
for(k=1; k<=g; k++)
{
if(HT[k].parent==0)
{
s1=k;
break;
}
}
for(j=1; j<=g; j++)
{
if((HT[j].weight<=HT[k].weight)&&(HT[j].parent==0))
s1=j;
}
for(m=1; m<=g; m++)
{
if((HT[m].parent==0)&&(m!=s1))
{
s2=m;
break;
}
}
for(n=1; n<=g; n++)
{
if((HT[n].weight<HT[m].weight)&&(HT[n].parent==0)&&(n!=s1))
s2=n;
}
}
int main()
{
int n;
huffmantree HF;
printf("输入叶子个数\n");
scanf("%d",&n);
creattree(HF,n);
}
实验5 哈夫曼树
最新推荐文章于 2022-12-26 00:00:00 发布