c语言。构建哈夫曼树及译码并逐行注释
时间: 2024-11-15 13:21:02 浏览: 61
C语言是一种广泛使用的高级编程语言,它的设计目标主要是高效性和结构化编程。对于构建哈夫曼树及其解码过程,这是一个基于数据结构和算法的概念,常用于数据压缩。
**构建哈夫曼树(Huffman Tree):**
哈夫曼树是一种自底向上的贪心算法,主要用于构建最优前缀编码。以下是C语言的一个基本实现:
```c
#include <stdio.h>
#include <stdlib.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;
}
// 比较函数,用于合并两个频率最小的结点
int compare(const void* a, const void* b) {
Node* n1 = (Node*)a;
Node* n2 = (Node*)b;
return n1->freq - n2->freq;
}
// 构建哈夫曼树
Node* buildHuffmanTree(int arr[], int n) {
if (n <= 1)
return arr[0];
// 对字符频率进行排序
qsort(arr, n, sizeof(Node), compare);
// 取出两个频率最低的结点,合成一个新的结点
Node* left = buildHuffmanTree(arr, n / 2);
Node* right = buildHuffmanTree(arr + n / 2, n - n / 2);
Node* temp = newNode('\0', left->freq + right->freq);
temp->left = left;
temp->right = right;
return temp;
}
// 解码哈夫曼树生成的编码
void printCodes(Node* root, char* codes, char code[]) {
if (!root || root->data != '\0')
codes[root->data] = code++, // 当遇到非空结点,将当前码添加到结果字符串中
else { // 如果是叶子结点,结束路径
printf("%c %s\n", root->data, code); // 输出字符及其对应的编码
codes[root->data] = '\0'; // 空字符标记编码结束
}
if (root->left) // 递归遍历左子树
printCodes(root->left, codes, code);
if (root->right) // 递归遍历右子树
printCodes(root->right, codes, code);
}
// 主函数示例
int main() {
// 示例字符数组和频率
int arr[] = {'A', 'B', 'C', 'D', 'E'};
int freq[] = {5, 9, 4, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
Node* root = buildHuffmanTree(arr, n);
char codes[256]; // 预先分配空间存储所有可能的编码
printCodes(root, codes, ""); // 初始化编码为 ""
return 0;
}
```
**逐行注释:**
1. 定义了节点结构体和一些必要的函数。
2. 新建节点函数创建一个带数据、频率和指向左右子节点的新结点。
3. 比较函数用于qsort对频率进行排序。
4. 构建哈夫曼树函数实现自底向上构建过程。
5. printCodes函数用于从根节点开始,按层次递归打印编码。
6. 主函数实例化数据,构建哈夫曼树,并调用printCodes函数输出编码。
阅读全文