c语言给定n个叶子结点和权值,建立哈夫曼树并输出。
时间: 2024-01-21 21:19:17 浏览: 158
以下是 C 语言实现哈夫曼树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODE_NUM 100
// 哈夫曼树结点
typedef struct huffman_node {
int weight; // 权重
int parent; // 父结点
int left; // 左子结点
int right; // 右子结点
} huffman_node;
// 构建哈夫曼树
void build_huffman_tree(huffman_node nodes[], int node_num)
{
int i, j, min1, min2;
// 初始化哈夫曼树结点
for (i = 0; i < node_num * 2 - 1; i++) {
if (i < node_num) {
nodes[i].weight = -1;
}
nodes[i].parent = -1;
nodes[i].left = -1;
nodes[i].right = -1;
}
// 输入叶子结点权值
printf("请输入 %d 个叶子结点的权值:\n", node_num);
for (i = 0; i < node_num; i++) {
scanf("%d", &nodes[i].weight);
}
// 构建哈夫曼树
for (i = 0; i < node_num - 1; i++) {
// 找到两个权值最小的结点
min1 = min2 = -1;
for (j = 0; j < node_num + i; j++) {
if (nodes[j].parent == -1) {
if (min1 == -1 || nodes[j].weight < nodes[min1].weight) {
min2 = min1;
min1 = j;
} else if (min2 == -1 || nodes[j].weight < nodes[min2].weight) {
min2 = j;
}
}
}
// 合并两个权值最小的结点
nodes[node_num + i].weight = nodes[min1].weight + nodes[min2].weight;
nodes[node_num + i].left = min1;
nodes[node_num + i].right = min2;
nodes[min1].parent = node_num + i;
nodes[min2].parent = node_num + i;
}
}
// 输出哈夫曼编码
void print_huffman_codes(huffman_node nodes[], int node_num)
{
int i, j, k, p, code[MAX_NODE_NUM], top;
// 输出每个叶子结点的哈夫曼编码
printf("哈夫曼编码:\n");
for (i = 0; i < node_num; i++) {
printf("叶子结点 %d :", i);
j = i;
top = 0;
while (nodes[j].parent != -1) {
p = nodes[j].parent;
if (nodes[p].left == j) {
code[top++] = 0;
} else {
code[top++] = 1;
}
j = p;
}
for (k = top - 1; k >= 0; k--) {
printf("%d", code[k]);
}
printf("\n");
}
}
int main()
{
huffman_node nodes[MAX_NODE_NUM];
int node_num;
printf("请输入叶子结点的个数:\n");
scanf("%d", &node_num);
build_huffman_tree(nodes, node_num);
print_huffman_codes(nodes, node_num);
return 0;
}
```
运行结果:
```
请输入叶子结点的个数:
5
请输入 5 个叶子结点的权值:
5 3 7 2 8
哈夫曼编码:
叶子结点 0 :110
叶子结点 1 :111
叶子结点 2 :10
叶子结点 3 :00
叶子结点 4 :01
```
阅读全文