#include<stdio.h>
#include<tchar.h>
#include<stdlib.h>
typedef struct {
int weight;
int parent, lchild, rchild;
} HTNode, * HuffmanTree;
typedef char ** HuffmanCode;
void Select(HuffmanTree HT,int j,int &s1,int &s2){
int min1=10000,min2=10000;
for(int k=1;k<=j;k++)
if(HT[k].weight<min1&&HT[k].parent==0){
min1=HT[k].weight;
s1=k;
}
for(int k=1;k<=j;k++)
if(HT[k].weight<min2&&HT[k].parent==0&&k!=s1){
min2=HT[k].weight;
s2=k;
}
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC,int *w, int n){
printf("\n以权值小的为左子树创建哈夫曼树\n\n\n");
if (n<=1)
return;
int m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
HuffmanTree p;
int i,s1,s2;
for(p=HT+1, i=1; i<=n; ++i, ++p, ++w)
*p={*w, 0, 0, 0};
for ( ; i<=m; ++i, ++p)
*p={0, 0, 0, 0};
for (i=n+1; i<=m; ++i){
Select(HT, i-1, s1, s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
char *cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for (i=1; i<=n; ++i) {
int start=n-1;
for (int c=i,f=HT[i].parent; f!=0; c=f, f=HT[f].parent)
if (HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char * )malloc((n-start)*sizeof(char));
strcpy(HC[i], &cd[start]);
}
free(cd);
}
void PrintHuffmanCode(HuffmanTree HT, HuffmanCode HC, int n)
{
HuffmanCode p=HC;
printf("\n\n");
for(int i=1; i<=n; i++)
{
printf("The weight %d HuffmanCode is: ", HT[i].weight);
while(*p[i]!='\0'){
printf("%c",*p[i]);
p[i]++;
}
printf("\n");
}
}
void PrintHuffmanTree(HuffmanTree HT,int n){
int m=2*n-1;
printf("HT\tweight\tparent\tlchild\trchild\n");
for(int i=1;i<m+1;i++){
printf("%d\t %d\t %d\t %d\t %d\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
}
}
main(){
int n = 5;
HuffmanTree HT;
HuffmanCode HC;
int a[5] = {5,6,2,9,7};
HuffmanCoding(HT, HC, a, n);
PrintHuffmanTree(HT,n);
PrintHuffmanCode(HT, HC, n);
system("pause");
}