哈夫曼树的创建C语言
时间: 2024-10-24 07:16:30 浏览: 13
数据结构 哈夫曼树C语言源代码
5星 · 资源好评率100%
哈夫曼树,也称为最优二叉树或最小带权路径长度树,是一种特殊的二叉树,用于数据压缩算法如Huffman编码。在C语言中,我们可以手动构建一个哈夫曼树,通常通过贪心策略来实现,步骤大致如下:
1. **计算频率**:首先统计字符出现的频率,每个字符对应一个权重。
2. **构造初始集合**:将所有字符及其权重放入一个优先队列,通常是两个指针的结构(左孩子小于右孩子)。
3. **合并节点**:从队列中取出两个权值最小的节点,合成一个新的节点,新节点的权值是两原节点权值之和,然后将这个新节点放回队列。
4. **重复直至只剩一个节点**:重复步骤3,直到队列只剩下一颗节点,这颗节点就是哈夫曼树的根。
5. **编码过程**:给每个字符分配一个编码,从根开始,向左走代表0,向右走代表1,遇到叶节点就停止并记录编码。
在C语言中,可以自定义一个结构体表示节点,并利用数组或链表实现优先队列。这是一个简化版的示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char data;
int freq;
struct Node *left, *right;
} Node;
Node* createNode(char data, int freq) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->freq = freq;
newNode->left = newNode->right = NULL;
return newNode;
}
// 插入优先队列函数
void insert(Node** head, Node* node) {
if (*head == NULL || node->freq < (*head)->freq) {
node->left = *head;
*head = node;
} else {
Node* current = *head;
while (current->right != NULL && current->right->freq < node->freq) {
current = current->right;
}
if (current->right == NULL) {
current->right = node;
} else {
// 这里处理复杂的情况...
}
}
}
// 创建哈夫曼树
Node* buildHuffmanTree(int arr[], int n) {
Node** heap = (Node**)malloc(n * sizeof(Node*));
for (int i = 0; i < n; ++i) {
heap[i] = createNode(arr[i], 1);
}
while (heap[0]->right != NULL) {
int i = 0, j = 1;
Node* leftChild = heap[i];
Node* rightChild = heap[j];
insert(&heap[0], createNode('\0', leftChild->freq + rightChild->freq, leftChild, rightChild));
free(leftChild);
free(rightChild);
i++;
j++;
}
return heap[0];
}
// 示例用法
int main() {
// 假设arr是一个字符频率数组...
Node* huffmanRoot = buildHuffmanTree(arr, n);
// ...然后你可以对这个哈夫曼树进行后续操作,比如生成编码
return 0;
}
```
阅读全文