C++怎么实现哈夫曼树
时间: 2024-05-13 10:15:06 浏览: 103
哈夫曼树C++实现.pdf
哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于数据压缩等领域。它的构造过程主要包括两个步骤:构造哈夫曼树和生成哈夫曼编码。
下面是哈夫曼树的构造过程:
1. 将各个权值看做是一个节点,把所有节点按照权值大小排序,从小到大依次编号为1,2,...,n。
2. 选取权值最小的两个节点,作为新节点的左右子节点,新节点的权值为两个节点的权值之和。将新节点插入到节点集合中,并将原来的两个节点从节点集合中删除。
3. 重复执行步骤2,直到节点集合中只剩下一个节点,此节点即为哈夫曼树的根节点。
C语言实现哈夫曼树的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int weight; // 权重
int parent; // 父节点
int left; // 左子节点
int right; // 右子节点
} Node;
void select_min(Node *nodes, int n, int *min1, int *min2) {
*min1 = -1;
*min2 = -1;
int i;
for (i = 0; i < n; i++) {
if (nodes[i].parent == -1) {
if (*min1 == -1 || nodes[i].weight < nodes[*min1].weight) {
*min2 = *min1;
*min1 = i;
} else if (*min2 == -1 || nodes[i].weight < nodes[*min2].weight) {
*min2 = i;
}
}
}
}
void build_huffman_tree(Node *nodes, int n) {
int i;
for (i = 0; i < 2 * n - 1; i++) {
if (i < n) {
printf("请输入权重:");
scanf("%d", &nodes[i].weight);
} else {
nodes[i].weight = 0;
}
nodes[i].parent = -1;
nodes[i].left = -1;
nodes[i].right = -1;
}
for (i = n; i < 2 * n - 1; i++) {
int min1, min2;
select_min(nodes, i, &min1, &min2);
nodes[i].weight = nodes[min1].weight + nodes[min2].weight;
nodes[i].left = min1;
nodes[i].right = min2;
nodes[min1].parent = i;
nodes[min2].parent = i;
}
}
int main() {
int n;
printf("请输入节点个数:");
scanf("%d", &n);
Node *nodes = (Node *)malloc(sizeof(Node) * (2 * n - 1));
build_huffman_tree(nodes, n);
int i;
for (i = 0; i < 2 * n - 1; i++) {
printf("节点%d: weight=%d, parent=%d, left=%d, right=%d\n", i, nodes[i].weight, nodes[i].parent, nodes[i].left, nodes[i].right);
}
free(nodes);
return 0;
}
```
在上面的代码中,首先定义了一个节点结构体,包括节点的权重、父节点、左子节点和右子节点。然后实现了select_min函数,用于在节点集合中选择权重最小的两个节点。接着实现了build_huffman_tree函数,用于构建哈夫曼树。在该函数中,首先为每个节点赋予权重,然后依次选择权重最小的两个节点构建新节点,并将新节点插入到节点集合中,直到集合中只剩下一个节点为止。最后在主函数中输出每个节点的信息。
需要注意的是,上面的代码中输入节点的权重是手动输入,实际上我们可以根据数据的出现频率来自动计算节点的权重,从而实现自动构建哈夫曼树的功能。
阅读全文