帮我用c语言写一个哈夫曼树构建并遍历输出的代码
时间: 2024-10-21 19:12:13 浏览: 37
在C语言中,我们可以使用哈希表和优先队列(例如二叉堆)来构建和遍历哈夫曼树。以下是一个简单的示例,它首先创建一个字符和频率的结构体,然后使用优先队列生成哈夫曼树,并实现编码过程。这里假设输入的字符数组`char_freq`已经包含了字符及其频率。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char data;
int freq;
struct Node *left, *right;
} Node;
typedef struct QueueNode {
Node *node;
struct QueueNode *next;
} QueueNode, *Queue;
// 构建最小堆
void minHeapify(Queue arr[], int n, int i) {
int smallest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left].node->freq < arr[smallest].node->freq)
smallest = left;
if (right < n && arr[right].node->freq < arr[smallest].node->freq)
smallest = right;
if (smallest != i) {
swap(arr[i], arr[smallest]);
minHeapify(arr, n, smallest);
}
}
// 插入节点到堆
void insert(Queue &q, Node *node) {
if (!q || q->node->freq > node->freq)
q->node = node;
else
q->next = insert(new QueueNode(node), q);
minHeapify(q, q->node == NULL ? 0 : q->node->freq + 1, 0);
}
// 从堆中删除最小元素
Node *extractMin(Queue &q) {
if (q->node == NULL)
return NULL;
Node *temp = q->node;
q->node = q->node->next;
if (q->node)
minHeapify(q, q->node == NULL ? 0 : q->node->freq + 1, 0);
free(temp);
return temp;
}
// 构建哈夫曼树
Node* buildHuffmanTree(int char_freq[], int n) {
// 初始化空堆
Queue pq = NULL;
for (int i = 0; i < n; i++) {
Node *node = new Node();
node->data = char_freq[i].first;
node->freq = char_freq[i].second;
insert(&pq, node);
}
while (pq->node != NULL) {
Node *left = extractMin(pq);
Node *right = extractMin(pq);
Node *parent = new Node();
parent->left = left;
parent->right = right;
parent->freq = left->freq + right->freq;
insert(&pq, parent);
}
return pq->node;
}
// 遍历哈夫曼树并输出编码
void traverse(Node *root, char *encoded, int index) {
if (root->left == NULL && root->right == NULL) { // 叶子节点
encoded[index] = root->data;
printf("%d ", index); // 输出对应的编码
return;
}
traverse(root->left, encoded, index + 1);
traverse(root->right, encoded, index + 1);
}
// 示例函数
void huffmanCode(char char_freq[][2]) {
int n = sizeof(char_freq) / sizeof(char_freq[0]);
Node *root = buildHuffmanTree(char_freq, n);
char encoded[100]; // 假设最大长度为100位
traverse(root, encoded, 0);
printf("Encoded frequencies:\n");
for (int i = 0; i < n; i++)
printf("%c: %s\n", char_freq[i][0], encoded);
}
// 主函数
int main() {
// 假设char_freq[]是一个二维数组,存储了字符及其频率
// ...填充数据...
huffmanCode(char_freq);
return 0;
}
```
这个代码片段展示了如何构建哈夫曼树以及遍历它。请注意,实际应用中你可能需要处理更复杂的数据结构来保存字符映射和编码信息。
阅读全文