用c语言构建一个哈夫曼树
时间: 2023-07-01 21:22:32 浏览: 124
基于c语言实现哈夫曼树赫夫曼树
5星 · 资源好评率100%
好的,下面是用C语言构建哈夫曼树的基本步骤:
1. 首先读入一段文本,统计各字符出现的频率。
2. 把每个字符及其出现频率作为一个节点,构建出一个森林(每个节点都是一个独立的树)。
3. 从森林中选取两个权值最小的节点(即出现频率最少的字符),构建出一棵新的二叉树,并把这两个节点挂在这棵新树的左右子树上。
4. 把这棵新树的根节点的权值设为左右子树权值之和,再把这个新节点插入到森林中。
5. 重复步骤3和4,直到森林中只剩下一棵树,这棵树即为哈夫曼树。
6. 最后对每个字符进行编码,规则是从根节点开始,往左走为0,往右走为1,直到到达叶子节点。
下面是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义哈夫曼树节点
typedef struct node {
char data; // 字符
int freq; // 频率
struct node *left; // 左子节点
struct node *right; // 右子节点
} Node;
// 定义哈夫曼树
typedef struct huffman_tree {
Node *root; // 根节点
} HuffmanTree;
// 创建一个哈夫曼树节点
Node *create_node(char data, int freq) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->freq = freq;
node->left = NULL;
node->right = NULL;
return node;
}
// 交换两个哈夫曼树节点
void swap_node(Node **a, Node **b) {
Node *temp = *a;
*a = *b;
*b = temp;
}
// 构建哈夫曼树
HuffmanTree *build_huffman_tree(char *text) {
// 统计各字符出现的频率
int freq[256] = {0};
for (int i = 0; text[i] != '\0'; i++) {
freq[text[i]]++;
}
// 把每个字符及其出现频率作为一个节点,构建出一个森林
Node *forest[256] = {0};
int count = 0;
for (int i = 0; i < 256; i++) {
if (freq[i] > 0) {
forest[count] = create_node(i, freq[i]);
count++;
}
}
// 从森林中选取两个权值最小的节点,构建出一棵新的二叉树,并把这两个节点挂在这棵新树的左右子树上。
// 把这棵新树的根节点的权值设为左右子树权值之和,再把这个新节点插入到森林中。
while (count > 1) {
int min1 = 0, min2 = 1;
if (forest[min1]->freq > forest[min2]->freq) {
swap_node(&forest[min1], &forest[min2]);
}
for (int i = 2; i < count; i++) {
if (forest[i]->freq < forest[min1]->freq) {
min2 = min1;
min1 = i;
} else if (forest[i]->freq < forest[min2]->freq) {
min2 = i;
}
}
Node *new_node = create_node('\0', forest[min1]->freq + forest[min2]->freq);
new_node->left = forest[min1];
new_node->right = forest[min2];
forest[min1] = new_node;
forest[min2] = forest[count - 1];
count--;
}
// 构建哈夫曼树
HuffmanTree *tree = (HuffmanTree *)malloc(sizeof(HuffmanTree));
tree->root = forest[0];
return tree;
}
// 从根节点开始遍历哈夫曼树,生成编码
void traversal_huffman_tree(Node *root, char *code, int depth, char **codes) {
if (root->left == NULL && root->right == NULL) {
code[depth] = '\0';
codes[root->data] = (char *)malloc((depth + 1) * sizeof(char));
strcpy(codes[root->data], code);
return;
}
code[depth] = '0';
traversal_huffman_tree(root->left, code, depth + 1, codes);
code[depth] = '1';
traversal_huffman_tree(root->right, code, depth + 1, codes);
}
// 生成哈夫曼编码
char **generate_huffman_codes(HuffmanTree *tree) {
char **codes = (char **)malloc(256 * sizeof(char *));
char code[256] = {0};
traversal_huffman_tree(tree->root, code, 0, codes);
return codes;
}
// 打印哈夫曼编码
void print_huffman_codes(char **codes) {
for (int i = 0; i < 256; i++) {
if (codes[i] != NULL) {
printf("%c: %s\n", i, codes[i]);
}
}
}
int main() {
char text[] = "hello world";
HuffmanTree *tree = build_huffman_tree(text);
char **codes = generate_huffman_codes(tree);
print_huffman_codes(codes);
return 0;
}
```
以上就是用C语言构建哈夫曼树的基本步骤和代码实现。
阅读全文