编写C语言程序实现为N个权值建立哈夫曼树实现输入叶子个数,输入能N个字符和权值并列出哈夫曼编码有头文件
时间: 2024-12-23 11:25:44 浏览: 7
在C语言中,我们可以使用自定义结构体、数组和函数来实现哈夫曼树,尤其是当需要处理动态数据集时,因为哈夫曼树的构建过程通常是递归的。下面是一个简单的示例,它演示了如何创建一个函数来接收输入的字符和权值,然后生成哈夫曼树及其编码。这里假设我们没有头文件,因为通常会在`stdio.h`, `stdlib.h`等中包含必要的库函数。
首先,我们需要定义一个结构体表示节点:
```c
typedef struct {
char character;
int weight; // 权重
struct Node *left, *right; // 子节点指针
} Node;
```
接着,编写一个用于合并两个权重最小的节点的辅助函数,这是构建哈夫曼树的核心部分:
```c
Node* mergeNodes(Node* left, Node* right) {
if (left == NULL)
return right;
else if (right == NULL)
return left;
if (left->weight < right->weight) {
left->right = mergeNodes(left->right, right);
return left;
} else {
right->left = mergeNodes(left, right->left);
return right;
}
}
```
为了计算新的权重和合并节点,可以定义一个递归函数来生成完整的哈夫曼树:
```c
Node* buildHuffmanTree(int *weights, int n) {
if (n <= 1) {
Node *node = malloc(sizeof(Node));
node->character = weights[0];
node->weight = weights[1];
node->left = node->right = NULL;
return node;
}
int min1 = 0, min2 = 1;
for (int i = 2; i < n; i++) {
if (weights[min1] > weights[i])
min1 = i;
if (weights[min2] > weights[i])
min2 = i;
}
Node *root = mergeNodes(buildHuffmanTree(weights, n - 1), buildHuffmanTree(&weights[min1 + 1], n - 2));
return root;
}
```
最后,为了得到每个字符的哈夫曼编码,我们可以添加一个辅助函数,遍历整个哈夫曼树:
```c
void printHuffmanCodes(Node* root, char* code, int level) {
if (root->left == NULL && root->right == NULL) { // 叶子节点
printf("%c: %s\n", root->character, code);
return;
}
code[level] = '0';
printHuffmanCodes(root->left, code, level + 1);
code[level] = '1';
printHuffmanCodes(root->right, code, level + 1);
}
// 调用函数并分配内存
int main() {
int weights[] = {5, 9, 6}; // 示例权值
int n = sizeof(weights) / sizeof(weights[0]);
Node *huffmanRoot = buildHuffmanTree(weights, n);
char huffmanCode[40]; // 预估最大编码长度
printHuffmanCodes(huffmanRoot, huffmanCode, 0);
free(huffmanRoot); // 释放内存
return 0;
}
```
阅读全文