c语言实现哈夫曼树完整代码
时间: 2024-11-28 07:15:54 浏览: 122
Huffman树,也称霍夫曼编码,是一种用于数据压缩的二叉树算法。在C语言中实现Huffman树通常包括构建频率统计表、构造优先级队列、合并两个最小节点以及生成编码过程。这里是一个简化版的Huffman树创建和编码的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef struct Node {
char data;
int freq;
struct Node *left, *right;
} Node;
Node* newNode(char data, int freq) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->freq = freq;
node->left = node->right = NULL;
return node;
}
void printCodes(Node *root, char *code, int len) {
if (root == NULL)
return;
if (root->left == NULL && root->right == NULL)
printf("%c : %s\n", root->data, code + len);
printCodes(root->left, code, len + 1);
printCodes(root->right, code, len + 1);
}
Node* buildHuffmanTree(int arr[], int n) {
// 先计算每个字符的频率
Node **pt = malloc(n * sizeof(Node *));
for (int i = 0; i < n; i++)
pt[i] = newNode(arr[i], 1);
while (n > 1) {
int min1 = 0, min2 = 0;
for (int i = 1; i < n; i++) {
if (pt[min1]->freq > pt[i]->freq)
min1 = i;
else if (pt[min1]->freq < pt[i]->freq)
min2 = i;
}
Node* temp = newNode('\0', pt[min1]->freq + pt[min2]->freq);
pt[min1] = temp->left;
pt[min2] = temp->right;
for (int i = 0; i < n; i++)
if (pt[i] == pt[min1])
pt[i] = temp;
else if (pt[i] == pt[min2])
pt[i] = temp;
n--;
}
return pt[0];
}
int main() {
char arr[] = {'A', 'B', 'C', 'D'};
int n = sizeof(arr) / sizeof(arr[0]);
Node* root = buildHuffmanTree(arr, n);
char code[100][50];
printCodes(root, "", 0);
return 0;
}
```
这个代码首先创建了频率统计数组,然后通过优先级队列(这里简单地表示为一个数组)递归地合并频率最低的节点,直到只剩下一个根节点为止。最后,它会打印出每个字符及其对应的编码。
注意:实际应用中可能会使用更复杂的数据结构(如二叉堆)来构建优先级队列,这取决于性能需求和平台支持。
阅读全文