用C语言代码构造一棵带权值为1,2,3,4的赫夫曼树并对其先序遍历
时间: 2024-10-10 22:02:50 浏览: 37
首先,我们需要创建一个节点结构体,并实现构建赫夫曼树、插入节点以及先序遍历等函数。由于赫夫曼树是由频繁度高的节点优先合并而成,这里我们可以假设输入是一组字符及其对应频率,例如`{'A':1, 'B':2, 'C':3, 'D':4}`。
以下是C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char value;
int weight;
struct Node *left, *right;
} Node;
// 插入节点
Node* newNode(char val, int wt) {
Node *newNode = (Node *) malloc(sizeof(Node));
newNode->value = val;
newNode->weight = wt;
newNode->left = newNode->right = NULL;
return newNode;
}
// 合并两个节点
Node* mergeNodes(Node *a, Node *b) {
if(a == NULL) return b;
if(b == NULL) return a;
if(a->weight < b->weight) {
a->right = mergeNodes(a->right, b);
} else {
a->left = mergeNodes(a, b->left);
}
return a;
}
// 构建赫夫曼树
Node* buildHuffmanTree(int freq[], int n) {
// 创建所有节点
Node* nodes[n] = {NULL};
for (int i = 0; i < n; ++i) {
nodes[i] = newNode(freq[i], i);
}
// 使用优先队列合并节点,直至只剩一个
for (int i = n - 1; i >= 1; i--) {
Node* temp = mergeNodes(nodes[i - 1], nodes[i]);
nodes[i - 1] = temp;
}
return nodes[0];
}
// 先序遍历
void preOrder(Node* root) {
if (root != NULL) {
printf("%c ", root->value); // 输出节点值
preOrder(root->left);
preOrder(root->right);
}
}
int main() {
int freq[] = {1, 2, 3, 4};
int n = sizeof(freq) / sizeof(freq[0]);
Node* huffmanRoot = buildHuffmanTree(freq, n);
// 先序遍历
preOrder(huffmanRoot);
free(huffmanRoot);
return 0;
}
```
在这个例子中,我们创建了四个节点分别代表'A':1, 'B':2, 'C':3, 'D':4,然后通过多次合并形成赫夫曼树。最后,我们按照先序遍历的顺序输出构建出的树的节点值。
阅读全文