请C语言实现哈夫曼树的构造,以及对该赫夫曼树的编码。
时间: 2024-05-14 18:17:32 浏览: 107
好的,以下是C语言实现哈夫曼树的构造和编码的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODE_NUM 100 // 最大结点数
// 哈夫曼树结点
typedef struct {
int weight; // 权值
int parent; // 父结点编号
int left; // 左子结点编号
int right; // 右子结点编号
} HuffmanNode;
// 构造哈夫曼树
void createHuffmanTree(HuffmanNode *nodes, int n) {
int i, j, min1, min2;
// 初始化结点数组
for (i = 0; i < 2 * n - 1; i++) {
nodes[i].weight = 0;
nodes[i].parent = -1;
nodes[i].left = -1;
nodes[i].right = -1;
}
// 输入每个结点的权值
for (i = 0; i < n; i++) {
printf("请输入第%d个结点的权值:", i + 1);
scanf("%d", &nodes[i].weight);
}
// 构造哈夫曼树
for (i = 0; i < n - 1; i++) {
min1 = min2 = -1;
// 找到两个未被选中的权值最小的结点
for (j = 0; j < n + 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[min1].parent = n + i;
nodes[min2].parent = n + i;
nodes[n + i].weight = nodes[min1].weight + nodes[min2].weight;
nodes[n + i].left = min1;
nodes[n + i].right = min2;
}
}
// 哈夫曼编码
void huffmanEncode(HuffmanNode *nodes, int n, char (*codes)[MAX_NODE_NUM]) {
int i, j, k, p;
char code[MAX_NODE_NUM];
// 从叶子结点向上遍历,生成编码
for (i = 0; i < n; i++) {
p = i;
k = 0;
while (nodes[p].parent != -1) {
if (nodes[nodes[p].parent].left == p) {
code[k++] = '0';
} else {
code[k++] = '1';
}
p = nodes[p].parent;
}
code[k] = '\0';
// 将编码反转
for (j = 0; j < k / 2; j++) {
char temp = code[j];
code[j] = code[k - j - 1];
code[k - j - 1] = temp;
}
strcpy(codes[i], code);
}
}
int main() {
int n, i;
HuffmanNode nodes[MAX_NODE_NUM];
char codes[MAX_NODE_NUM][MAX_NODE_NUM];
printf("请输入结点个数:");
scanf("%d", &n);
createHuffmanTree(nodes, n);
huffmanEncode(nodes, n, codes);
printf("哈夫曼编码如下:\n");
for (i = 0; i < n; i++) {
printf("结点%d的编码为:%s\n", i + 1, codes[i]);
}
return 0;
}
```
示例输出:
```
请输入结点个数:5
请输入第1个结点的权值:2
请输入第2个结点的权值:4
请输入第3个结点的权值:6
请输入第4个结点的权值:8
请输入第5个结点的权值:10
哈夫曼编码如下:
结点1的编码为:1100
结点2的编码为:100
结点3的编码为:00
结点4的编码为:01
结点5的编码为:111
```
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![dsw](https://img-home.csdnimg.cn/images/20250102104920.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)