#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tree{
int parent,lchild,rchild;
int weight;
}HNode,*HTree;
void Selete(HTree HT,int n,int &s1,int &s2)
{
int i;
int min1=1000000,min2=1000000;
for(i=1;i<=n;i++)
{
if(HT[i].parent==0)
{
if(min1>HT[i].weight)
{
min2=min1;s2=s1;
min1=HT[i].weight;
s1=i;
}
else if(min2>HT[i].weight)
{
s2=i;
min2=HT[i].weight;
}
}
}
}
void InitHuffmanTree(HTree &bt,int *w,int n)
{//建立哈夫曼树
int i,m;
int s1,s2;
m=2*n-1;
if(n<=1)
return ;
bt=(HTree)malloc((m)*sizeof(HNode));
for(i=0;i<=n;i++)
{
bt[i].weight=w[i];
bt[i].parent=bt[i].rchild=bt[i].lchild=0;
}
for(;i<=m;i++)
bt[i].weight=bt[i].lchild=bt[i].rchild=bt[i].parent=0;
for(i=n+1;i<=m;i++)
{
s1=s2=0;
Selete(bt,i-1,s1,s2);
bt[i].lchild=s1;
bt[i].rchild=s2;
bt[i].weight=bt[s1].weight+bt[s2].weight;
bt[s1].parent=i;
bt[s2].parent=i;
}
}
void HuffmanCoding(HTree bt,char HC[][100],int n)
{//破译哈夫曼编码
char *cd;
int start;
int c,f,i;
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,f=bt[i].parent;f!=0;c=f,f=bt[f].parent)
if(bt[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
strcpy(HC[i],&cd[start]);
}
for(i=1;i<=n;i++)
printf("%s\n",HC[i]);
free(cd);
}
int main()
{
HTree bt;
char HC[100][100];
int n,i;
int weight[100];
printf("请输入数据的个数:");
scanf("%d",&n);
printf("请输入每个数据的权重:");
weight[0]=0;
for(i=1;i<=n;i++)
scanf("%d",weight+i);
InitHuffmanTree(bt,weight,n);
HuffmanCoding(bt,HC,n);
return 0;
}
哈夫曼编码
最新推荐文章于 2022-06-30 14:25:27 发布