用C语言实现哈夫曼树的建立算法
时间: 2023-10-21 19:03:41 浏览: 52
好的,下面是用C语言实现哈夫曼树的建立算法的一个简单示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 定义哈夫曼树的结构体
typedef struct {
int weight; // 权值
int parent; // 父节点
int leftchild; // 左孩子节点
int rightchild;// 右孩子节点
}HuffmanNode, *HuffmanTree;
// 构建哈夫曼树
void createHuffmanTree(HuffmanTree *HT, int n, int *w) {
// 初始化哈夫曼树节点数组
int m = 2 * n - 1;
*HT = (HuffmanTree)malloc((m+1) * sizeof(HuffmanNode));
for (int i = 1; i <= m; i++) {
(*HT)[i].weight = 0;
(*HT)[i].parent = 0;
(*HT)[i].leftchild = 0;
(*HT)[i].rightchild = 0;
}
// 输入权值
for (int i = 1; i <= n; i++) {
(*HT)[i].weight = w[i-1];
}
// 构建哈夫曼树
for (int i = n+1; i <= m; i++) {
int s1, s2;
int min1 = min2 = MAX_SIZE;
for (int j = 1; j < i; j++) {
if ((*HT)[j].parent == 0) {
if ((*HT)[j].weight < min1) {
min2 = min1;
s2 = s1;
min1 = (*HT)[j].weight;
s1 = j;
} else if ((*HT)[j].weight < min2) {
min2 = (*HT)[j].weight;
s2 = j;
}
}
}
(*HT)[s1].parent = i;
(*HT)[s2].parent = i;
(*HT)[i].leftchild = s1;
(*HT)[i].rightchild = s2;
(*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight;
}
}
int main() {
HuffmanTree HT;
int n, w[MAX_SIZE];
printf("请输入权值个数n:");
scanf("%d", &n);
printf("请输入权值:");
for (int i = 0; i < n; i++) {
scanf("%d", &w[i]);
}
createHuffmanTree(&HT, n, w);
printf("哈夫曼树的结构如下:\n");
printf("weight parent leftchild rightchild\n");
for (int i = 1; i <= 2*n-1; i++) {
printf("%-7d %-7d %-10d %-10d\n", HT[i].weight, HT[i].parent, HT[i].leftchild, HT[i].rightchild);
}
return 0;
}
```
以上是一个简单的哈夫曼树建立算法的示例,其中 `createHuffmanTree` 函数实现了哈夫曼树的构建过程,主函数通过输入权值个数和权值数组来调用此函数,并输出构建好的哈夫曼树的结构。