#include<stdio.h>
#include<malloc.h>
typedef struct{
float weight; //权值
int parent,lch,rch; //双亲,左孩子,右孩子编号
}HuffmanTree;
void Select(HuffmanTree *HT,int size,int *L,int *R){
float min_val; //定义最小值
for(int i=1;i<=size;i++){ //从头开始选一个parent为 0 的数
if(HT[i].parent==0){
min_val=HT[i].weight;
*L=i;
break;
}
}
for (int i = 1; i <= size; i++){ //找出parent为 0 的最小值
if (HT[i].weight < min_val && HT[i].parent==0){
min_val = HT[i].weight;
*L = i;
}
}
for(int i=1;i<=size;i++){ //从头开始选一个parent为 0 的数,且被选数序号不能等于被找到的最小值的序号
if(HT[i].parent==0 && i != *L){
min_val=HT[i].weight;
*R=i;
break;
}
}
for (int i = 1; i <= size; i++){ //找出parent为 0 的次小值,且序号不能等于最小值序号
if (HT[i].weight < min_val && i != *L && HT[i].parent==0){
min_val = HT[i].weight;
*R = i;
}
}
}
HuffmanTree * CreatHuffmanTree(HuffmanTree *HT,int n){ //构造哈夫曼树
if(n<=1)
return NULL;
int m=2*n-1;
HT=(HuffmanTree *)malloc(sizeof(HuffmanTree)*(m+1)); //序号从1开始,所以m+1。
for(int i=1;i<=m;i++){ //初始化结构体
HT[i].weight=0;
HT[i].lch=0;
HT[i].rch=0;
HT[i].parent=0;
}
for(int i=1;i<=n;i++){ //权值赋值
float wt[]={0.4,0.3,0.15,0.05,0.04,0.03,0.03};
HT[i].weight=wt[i-1];
}
for(int i=n+1;i<=m;i++){ //开始建哈夫曼表
int L,R;
Select(HT,i-1,&L,&R); //返回最小值和次小值,且最小值序号为左孩子序号,次小值序号为右孩子序号
HT[L].parent=i; HT[R].parent=i; //标注左右孩子的双亲序号
HT[i].lch=L; HT[i].rch=R; //双亲结点的左右孩子序号
HT[i].weight=HT[L].weight + HT[R].weight; //权值为左右孩子权值之和
}
return HT;
}
void show(HuffmanTree *H,int n){
printf(" id\t\tweight\t\tparent\t\tlch\t\trch\n");
for(int i=1;i<=2*n-1;i++)
printf(" %d\t\t%g\t\t%d\t\t%d\t\t%d\n", i, H[i].weight, H[i].parent, H[i].lch, H[i].rch);
}
int main(void){
int n=7; //数组元素个数
HuffmanTree *h=CreatHuffmanTree(h,n);
show(h,n);
return 0;
}
一看就懂的构建哈夫曼树(Huffman Tree)
最新推荐文章于 2022-11-06 18:22:45 发布