根据哈夫曼树求对应哈夫曼编码的C语言代码
时间: 2025-01-01 19:38:29 浏览: 17
在C语言中,我们可以使用哈夫曼树(Huffman Tree)算法来生成二进制码,通常用于数据压缩。以下是一个简单的示例,它创建了一个Huffman树并计算每个字符的编码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义节点结构体
typedef struct Node {
char data;
int freq; // 频率
struct Node* left;
struct Node* right;
} Node;
// 插入函数
Node* insert(Node** root, char data) {
if (*root == NULL) {
*root = (Node*)malloc(sizeof(Node));
(*root)->data = data;
(*root)->freq = 1;
(*root)->left = NULL;
(*root)->right = NULL;
return *root;
}
Node* current = *root;
if (data < current->data) {
current->left = insert(¤t->left, data);
} else if (data > current->data) {
current->right = insert(¤t->right, data);
} else {
current->freq++;
}
return *root;
}
// 构建哈夫曼树
Node* buildHuffmanTree(Node** root) {
if (*root == NULL || (*root)->left == NULL && (*root)->right == NULL)
return *root;
Node* temp = (Node*)malloc(sizeof(Node));
temp->freq = (*root)->freq + ((*root)->left)->freq + ((*root)->right)->freq;
temp->left = (*root);
temp->right = NULL;
Node* smaller = insert(&temp->right, (*root)->left);
Node* larger = insert(&smaller, (*root)->right);
free(*root);
*root = larger;
return buildHuffmanTree(&*root);
}
// 计算哈夫曼编码
void huffmanCode(Node* root, char* code, char data) {
if (root == NULL)
return;
if (root->data == data)
code[root->data] = '0';
else
code[root->data] = '1';
huffmanCode(root->left, code, data);
huffmanCode(root->right, code, data);
}
// 打印哈夫曼编码
void printCodes(char* codes, int n) {
for (int i = 0; i < n; i++)
printf("%d: %s\n", i, codes[i]);
}
int main() {
// 示例数据,这里可以替换为你需要编码的实际字符及其频率
Node* root = NULL;
const char data[] = {'A', 'B', 'C', 'D'};
int freq[] = {5, 4, 6, 3};
for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) {
root = insert(&root, data[i]);
}
root = buildHuffmanTree(&root);
char code[256];
memset(code, '\0', sizeof(code));
for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) {
huffmanCode(root, code, data[i]);
}
printCodes(code, sizeof(data) / sizeof(data[0]));
return 0;
}
```
这个程序首先插入所有字符及其频率到Huffman树,然后从根节点开始遍历,生成每个字符的编码。请注意,这只是一个基本实现,实际应用中可能需要处理更多细节。
阅读全文