请用C语言写出一个完整的哈夫曼树建立的代码
时间: 2024-05-05 14:21:14 浏览: 117
下面是一个用C语言实现哈夫曼树建立的完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 哈夫曼树结点结构体
typedef struct huffman_node {
int weight; // 权值
int parent; // 双亲结点下标
int left; // 左孩子结点下标
int right; // 右孩子结点下标
} HuffmanNode;
// 建立哈夫曼树函数
void create_huffman_tree(HuffmanNode *huffman_tree, int n)
{
int i, j, min1, min2;
for (i = 0; i < 2 * n - 1; i++) {
huffman_tree[i].weight = 0;
huffman_tree[i].parent = -1;
huffman_tree[i].left = -1;
huffman_tree[i].right = -1;
}
// 输入n个叶子结点的权值
printf("请输入%d个叶子结点的权值:\n", n);
for (i = 0; i < n; i++) {
printf("weight[%d] = ", i);
scanf("%d", &huffman_tree[i].weight);
}
// 建立哈夫曼树
for (i = 0; i < n - 1; i++) {
min1 = min2 = 0;
// 找到权值最小的两个结点
for (j = 0; j < n + i; j++) {
if (huffman_tree[j].parent == -1) {
if (huffman_tree[j].weight < huffman_tree[min1].weight) {
min2 = min1;
min1 = j;
} else if (huffman_tree[j].weight < huffman_tree[min2].weight) {
min2 = j;
}
}
}
// 合并最小的两个结点
huffman_tree[min1].parent = n + i;
huffman_tree[min2].parent = n + i;
huffman_tree[n + i].weight = huffman_tree[min1].weight + huffman_tree[min2].weight;
huffman_tree[n + i].left = min1;
huffman_tree[n + i].right = min2;
}
}
int main()
{
int n, i, root;
HuffmanNode *huffman_tree;
printf("请输入叶子结点的个数:");
scanf("%d", &n);
huffman_tree = (HuffmanNode *)malloc(sizeof(HuffmanNode) * (2 * n - 1));
create_huffman_tree(huffman_tree, n);
// 找到根结点
for (i = 0; i < n * 2 - 1; i++) {
if (huffman_tree[i].parent == -1) {
root = i;
break;
}
}
printf("哈夫曼树的结点信息如下:\n");
printf("%4s%8s%8s%8s%8s\n", "结点", "权值", "双亲", "左孩子", "右孩子");
for (i = 0; i < n * 2 - 1; i++) {
printf("%4d%8d%8d%8d%8d\n", i, huffman_tree[i].weight, huffman_tree[i].parent, huffman_tree[i].left, huffman_tree[i].right);
}
free(huffman_tree);
return 0;
}
```
使用方法:
1. 运行程序后输入叶子结点的个数n,程序会要求输入n个叶子结点的权值。
2. 程序会按照输入的权值建立哈夫曼树,并打印出哈夫曼树的结点信息。
注意事项:
1. 在程序中,我们使用了结构体来表示哈夫曼树的结点,其中包括了权值、双亲结点下标、左孩子结点下标和右孩子结点下标等信息。
2. 在建立哈夫曼树的过程中,我们使用了贪心的思想,每次合并权值最小的两个结点,直到最后只剩下一个根结点。
3. 在程序中,我们使用了动态内存分配来分配哈夫曼树结点数组的内存空间,避免了在编译时确定数组大小的限制。同时,我们在程序结束时使用了free函数来释放这部分内存空间,避免了内存泄漏的情况。
阅读全文