题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/553892e21e8747d3997846838e5bcbab.png#pic_center)
解答
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_TREE_SIZE 100
typedef struct{
int weight;
int parent;
int lchild;
int rchild;
}HTNode;
HTNode HT[MAX_TREE_SIZE];
typedef char* HCNode;
typedef HCNode* HuffmanCode;
int N;
int findMin(int i){
int min=INT_MAX;
int tag=-1;
int j;
for(j=1;j<=i;j++){
if(HT[j].parent==0){
if(HT[j].weight<min){
min=HT[j].weight;
tag=j;
}
}
}
return tag;
}
int CreateHuffmanTree(HTNode HT[]){
int i;
int count;
int min1, min2;
printf("请录入哈夫曼树叶子结点个数→");
scanf("%d", &N);
printf("请依次录入各叶子结点的权值→ ");
for(i=1; i<=N; i++){
scanf("%d", &HT[i].weight);
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
i--;
while(1){
min1=findMin(i);
HT[min1].parent=i+1;
min2=findMin(i);
if(min2==-1){
HT[i].parent=0;
break;
}
else
HT[min2].parent=i+1;
HT[i+1].parent=0;
HT[i+1].lchild=min1;
HT[i+1].rchild=min2;
HT[i+1].weight=HT[min1].weight+HT[min2].weight;
i++;
}
printf("此哈夫曼树的结点个数为%d\n",i);
}
int HuffmanCodeing(HTNode HT[], HuffmanCode *HC){
char *code;
int n, i;
int start, c, f;
n = N;
*HC = (HuffmanCode)malloc((n+1)*sizeof(HCNode));
if(!(*HC))
exit(0);
code = (char*)malloc(n*sizeof(char));
if(!code)
exit(0);
code[n-1] = '\0';
for(i=1; i<=n; i++){
start = n - 1;
for(c=i,f=HT[i].parent; f!=0; c=f,f=HT[f].parent){
if(HT[f].lchild==c)
code[--start] = '0';
else
code[--start] = '1';
}
(*HC)[i] = (char*)malloc((n-start)*sizeof(char));
strcpy((*HC)[i], &code[start]);
}
free(code);
}
void ShowHuffmanTree(HTNode HT[]){
int i;
printf(" *order weight parent lchild rchild\n");
for(i=1; i<=2*N-1; i++){
printf(" %2d %4d %2d %2d %2d\n", i, HT[i].weight, HT[i].parent, HT[i].lchild, HT[i].rchild);
}
}
void ShowHuffmanCode(HTNode HT[], HuffmanCode HC){
int i;
printf("*order weight 哈夫曼编码\n");
for(i=1; i<=N; i++)
printf(" %2d %4d ──→ %-14s\n", i, HT[i].weight, HC[i]);
}
int WPL(HTNode HT[], HuffmanCode HC){
int i,wpl=0;
for(i=1; i<=N; i++)
wpl += HT[i].weight*strlen(HC[i]);
return wpl;
}
int main(){
HuffmanCode HC;
printf("创建哈夫曼树 HT ...\n");
CreateHuffmanTree(HT);
printf("展示哈夫曼树 HT = \n");
ShowHuffmanTree(HT);
printf("计算哈夫曼编码 HC ...\n");
HuffmanCodeing(HT, &HC);
printf("\n");
printf("展示哈夫曼编码 HC = \n");
ShowHuffmanCode(HT, HC);
printf("\n");
printf("哈夫曼树的带权路径长度 WPL = %d\n",WPL(HT, HC));
printf("\n");
return 0;
}