请C语言编程实现哈夫曼树的构造,以及对该赫夫曼树的编码。
时间: 2024-05-11 16:18:57 浏览: 8
以下是C语言实现哈夫曼树的代码,其中假设有一个数组freq[]存储了每个字符的出现频率,字符集大小为n:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 50
typedef struct {
int weight; // 权值
int parent; // 父节点下标
int lchild; // 左子节点下标
int rchild; // 右子节点下标
} HTNode, *HuffmanTree;
// 选择权值最小的两个节点
void select(HuffmanTree tree, int n, int *s1, int *s2) {
int i;
*s1 = *s2 = -1;
for (i = 0; i < n; i++) {
if (tree[i].parent == -1) {
if (*s1 == -1 || tree[i].weight < tree[*s1].weight) {
*s2 = *s1;
*s1 = i;
} else if (*s2 == -1 || tree[i].weight < tree[*s2].weight) {
*s2 = i;
}
}
}
}
// 构造哈夫曼树
void createHuffmanTree(HuffmanTree *tree, int n, int *freq) {
if (n <= 1) {
return;
}
int m = 2 * n - 1;
*tree = (HuffmanTree) malloc(m * sizeof(HTNode));
int i;
for (i = 0; i < n; i++) {
(*tree)[i].weight = freq[i];
(*tree)[i].parent = -1;
(*tree)[i].lchild = -1;
(*tree)[i].rchild = -1;
}
for (; i < m; i++) {
(*tree)[i].weight = 0;
(*tree)[i].parent = -1;
(*tree)[i].lchild = -1;
(*tree)[i].rchild = -1;
}
for (i = n; i < m; i++) {
int s1, s2;
select(*tree, i, &s1, &s2);
(*tree)[i].weight = (*tree)[s1].weight + (*tree)[s2].weight;
(*tree)[i].lchild = s1;
(*tree)[i].rchild = s2;
(*tree)[s1].parent = i;
(*tree)[s2].parent = i;
}
}
// 哈夫曼编码
void huffmanEncoding(HuffmanTree tree, int n, char **code) {
*code = (char *) malloc(n * MAX_SIZE * sizeof(char));
char *temp = (char *) malloc(n * sizeof(char));
int i, j, start, current, parent;
temp[n - 1] = '\0';
for (i = 0; i < n; i++) {
start = n - 1;
current = i;
parent = tree[current].parent;
while (parent != -1) {
if (tree[parent].lchild == current) {
temp[--start] = '0';
} else {
temp[--start] = '1';
}
current = parent;
parent = tree[current].parent;
}
strcpy(*code + i * MAX_SIZE, temp + start);
}
free(temp);
}
// 测试
int main() {
int freq[] = {5, 6, 11, 12, 15, 25};
int n = sizeof(freq) / sizeof(freq[0]);
HuffmanTree tree;
createHuffmanTree(&tree, n, freq);
char *code;
huffmanEncoding(tree, n, &code);
int i;
for (i = 0; i < n; i++) {
printf("%d: %s\n", i, code + i * MAX_SIZE);
}
return 0;
}
```
在上述代码中,我们定义了一个结构体HTNode来表示哈夫曼树的节点,其中weight表示节点权值,parent表示父节点下标,lchild表示左子节点下标,rchild表示右子节点下标。我们使用HuffmanTree来表示哈夫曼树,即HuffmanTree类型的变量指向一个HTNode类型的数组。
createHuffmanTree函数用于构造哈夫曼树,其中tree表示构造出的哈夫曼树,n表示字符集大小,freq数组存储字符的出现频率。
huffmanEncoding函数用于对哈夫曼树进行编码,其中code表示编码结果,n表示字符集大小,MAX_SIZE表示编码的最大长度。在该函数中,我们使用一个temp数组来暂存每个字符的编码结果,然后将其拷贝到code中。
测试代码中,我们使用一个freq数组来表示字符的出现频率,然后调用createHuffmanTree和huffmanEncoding函数分别构造哈夫曼树和进行编码,并输出每个字符的编码结果。