这个哈夫曼树我就不具体介绍了,反正这个相关介绍很多。我就直接上代码了,我的注释已经很多了,相信看官不可能,看不懂,因为我输入的权重是5个概率,和为1,于是我顺便计算了信息熵,这个不是重点。
#include <stdint.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXVALUE 32767//定义一个权重初始化,后面会用到
#define MAXLISTLEN 100
#pragma warning(disable:4996)//防止scanf vs报错
typedef struct { //哈夫曼树结构体
float weight; //输入权值
int parent, lchild, rchild; //双亲节点,左孩子,右孩子
}HNodeType;
typedef struct { //哈夫曼编码结构体
int bit[8]; //存放当前结点的哈夫曼编码
int start; //bit[start]-bit[8[存放哈夫曼编码
}HCodeType;
//HNodeType HuffNode[MAXLISTLEN]; //定义全局变量数组HuffNode存放哈夫曼树
HNodeType* HuffNode = (HNodeType*)malloc(sizeof(HNodeType)*MAXLISTLEN);
HCodeType HuffCode[5]; //定义全局变量数组HuffCode存放哈夫曼编码,因为暂定输入5个数字
int n =5; //定义全局变量n表示叶子结点个数
float quan_zhong_list[]= { 0.2,0.3, 0.1, 0.15,0.25 };
void CreateHuffTree(void) { //构造哈夫曼树
int i, j, a, b, x1, x2;
/* scanf("%d", &n); */ //输入叶子节点个数,小于100
for (i = 0; i < 2 * n-1; i++) //HuffNode 初始化
{
HuffNode[i].weight = 0;
HuffNode[i].parent = -1;
HuffNode[i].lchild = -1;
HuffNode[i].rchild = -1;
}
//printf("输入%d个节点的权值\n", n);
for (i = 0; i < n; i++) {
HuffNode[i].weight = quan_zhong_list[i];
//scanf("%d", &HuffNode[i].weight);//输入N个叶子节点的权值
}
for (i = 0; i < n-1; i++) { //构造哈夫曼树
a = MAXVALUE;
b = MAXVALUE;
x1 = -1;//记录最小a的索引
x2 = -1;//记录第二小b的索引
for (j = 0; j < n + i; j++) { //选取最小a和次小b两个权值
if (HuffNode[j].parent == -1 && HuffNode[j].weight < a) {//-1代表未初始化,HuffNode[j].weight < a保障a最小
b = a;//那么原先最小为第二小
x2 = x1;
a = HuffNode[j].weight;
x1 = j;
}
else
if (HuffNode[j].parent == -1 && HuffNode[j].weight < b) {
b = HuffNode[j].weight;
x2 = j;//第二小b的索引赋值
}
}
HuffNode[x1].parent = n + i;
HuffNode[x2].parent = n + i;
HuffNode[n + i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
HuffNode[n + i].lchild = x1;
HuffNode[n + i].rchild = x2;
}
}
void CreateHuffCode(void) { //构造哈夫曼编码
HCodeType cd;
int i, j, c, p;
for (i = 0; i < n; i++) {//为一个个字符根据创建的哈夫曼树进行编码
cd.start = 7;//暂时定为所有字符编码长度都小于等于8
c = i;
p = HuffNode[i].parent;
while (p != -1) {
if (HuffNode[p].lchild == c)
cd.bit[cd.start] = 0;
else
cd.bit[cd.start] = 1;
cd.start--;
c = p;
p = HuffNode[c].parent;
}
//printf("cd.start%d", cd.start);
for (j = cd.start + 1; j < 8; j++) {
HuffCode[i].bit[j] = cd.bit[j];
//printf("a%d", cd.bit[j]);
}
HuffCode[i].start = cd.start;
//printf("b");
}
}
void PrintHuffcode(void) { //输出每个叶子结点的哈夫曼编码
int i, j;
for (i = 0; i < n; i++)
{
printf("第%d个叶子结点的哈夫曼编码为:",i);
for (j = HuffCode[i].start; j <8; j++)
printf("%d", HuffCode[i].bit[j]);
printf("\n");
}
}
int main() {
CreateHuffTree(); //构造哈夫曼树
CreateHuffCode();
PrintHuffcode();
free(HuffNode);
float xin_xi_shang = 0;
for (int i = 0; i < n; i++) {
xin_xi_shang += -1 * log( quan_zhong_list[i]) * quan_zhong_list[i];
}
printf("信息熵为%lf\n", xin_xi_shang);
}
代码到这就好了,记得点个免费的赞。