写一个输入哈夫曼树的叶子结点数及其对应的权值创建哈夫曼树的c语言代码
时间: 2024-12-22 19:21:31 浏览: 14
在C语言中,我们可以使用优先队列(二叉堆)和哈希表来实现构建哈夫曼树的过程。下面是一个简单的示例代码,假设我们已经有了一个结构体`HuffmanNode`表示节点,包含权重(weight)和是否为叶子节点(is_leaf),以及一个数组`input_weights`存储了叶子结点的权值:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <queue>
typedef struct HuffmanNode {
char* data;
int weight;
bool is_leaf;
struct HuffmanNode* left, *right;
} HuffmanNode;
// 创建一个新的哈夫曼节点
HuffmanNode* createNode(char* data, int weight) {
HuffmanNode* newNode = (HuffmanNode*)malloc(sizeof(HuffmanNode));
newNode->data = data;
newNode->weight = weight;
newNode->left = newNode->right = NULL;
newNode->is_leaf = true; // 初始设置为叶子节点
return newNode;
}
// 比较两个节点的重量,用于堆排序
int compareNodes(const void* a, const void* b) {
HuffmanNode* nodeA = *(HuffmanNode**)a;
HuffmanNode* nodeB = *(HuffmanNode**)b;
return nodeB->weight - nodeA->weight;
}
// 构建哈夫曼树
HuffmanNode* buildHuffmanTree(int* input_weights, int num_leaves) {
// 将叶子节点放入优先队列中
priority_queue<HuffmanNode*, std::vector<HuffmanNode*>, decltype(compareNodes)> huffmanQueue(compareNodes);
for (int i = 0; i < num_leaves; i++) {
huffmanQueue.push(createNode("leaf" + to_string(i), input_weights[i]));
}
while (huffmanQueue.size() > 1) {
// 取出两个权值最小的节点
HuffmanNode* node1 = huffmanQueue.top();
huffmanQueue.pop();
HuffmanNode* node2 = huffmanQueue.top();
huffmanQueue.pop();
// 创建新的节点并加入优先队列
HuffmanNode* newNode = createNode(NULL, node1->weight + node2->weight);
newNode->left = node1;
newNode->right = node2;
newNode->is_leaf = false;
huffmanQueue.push(newNode);
}
return huffmanQueue.top(); // 返回根节点
}
int main() {
int input_weights[] = {5, 7, 3}; // 假设这是一些叶子节点的权值
int num_leaves = sizeof(input_weights) / sizeof(input_weights[0]);
HuffmanNode* root = buildHuffmanTree(input_weights, num_leaves);
// 此处你可以添加代码来打印或处理生成的哈夫曼树
return 0;
}
```
在这个代码中,`buildHuffmanTree`函数首先创建叶子节点,并将它们放入优先队列中。然后它不断从队列中取出两个最小的节点合并成新的节点,直到队列只剩下一个元素,这个就是哈夫曼树的根。
阅读全文