用C语言编写程序构造哈夫曼树 给出以下权重2, 3, 7, 9, 18, 25,构造哈夫曼树。 以先序遍历方式输出节点,换行隔开。 注意:构造哈夫曼树时,节点值小的在左侧。
时间: 2024-11-30 14:14:43 浏览: 16
在C语言中构造哈夫曼树通常需要手动实现一种贪心算法,因为哈夫曼树是一种自底向上的构造过程。以下是基于给定权重构建哈夫曼树的一个简化的步骤:
1. 首先,创建一个结构体来表示树的节点,包含两个部分:权重(weight)和下一个节点(left和right)。
```c
typedef struct Node {
int weight;
struct Node* left;
struct Node* right;
} HuffmanNode;
```
2. 定义一个函数来比较两个节点的权重,用于排序。
```c
int compareWeights(const void* a, const void* b) {
const HuffmanNode* nodeA = (HuffmanNode*)a;
const HuffmanNode* nodeB = (HuffmanNode*)b;
return nodeA->weight - nodeB->weight;
}
```
3. 接着,创建一个优先队列来存储待合并的节点,并将所有给定的权重插入到这个队列中。
```c
HuffmanNode queue[6];
int weights[] = {2, 3, 7, 9, 18, 25};
int n = sizeof(weights) / sizeof(weights[0]);
for (int i = 0; i < n; i++) {
queue[i].weight = weights[i];
queue[i].left = NULL;
queue[i].right = NULL;
}
```
4. 使用快速选择或类似算法找到队列中最轻的两个节点,然后将它们合并成一个新的节点,新节点的权重是这两个节点之和,左子树是第一个节点,右子树是第二个节点。
```c
void merge(HuffmanNode** root, HuffmanNode* l, HuffmanNode* r) {
HuffmanNode* newNode = malloc(sizeof(HuffmanNode));
newNode->weight = l->weight + r->weight;
newNode->left = l;
newNode->right = r;
*root = newNode;
}
while (queue.size() > 1) {
// 选择队列最轻的两个节点进行合并
HuffmanNode* left = queue[0];
int leftIndex = 0;
for (int i = 1; i < queue.size(); i++) {
if (queue[i].weight < left->weight) {
left = queue[i];
leftIndex = i;
}
}
HuffmanNode* right = queue[leftIndex + 1];
queue[leftIndex] = NULL; // 移除已合并节点
merge(&queue[0], left, right);
}
```
5. 最终得到的根节点就是哈夫曼树的根,可以递归地进行前序遍历打印节点。
```c
void preOrderTraversal(HuffmanNode* node) {
if (node == NULL)
return;
printf("%d ", node->weight); // 打印节点值
preOrderTraversal(node->left);
preOrderTraversal(node->right);
}
// 输出前序遍历结果
preOrderTraversal(queue[0]);
```
注意:上述代码并没有完整的错误处理和边界条件检查,实际使用时需要完善这些部分。
阅读全文