请使用顺序存储结构(数组)方式,创建哈夫曼树
时间: 2023-12-06 11:38:38 浏览: 54
使用顺序存储结构(数组)方式创建哈夫曼树的步骤如下:
1. 定义一个结构体来表示哈夫曼树的结点,包括权值和父节点、左右子节点的下标。
```c
struct HuffmanNode {
int weight; // 权值
int parent; // 父节点下标
int left; // 左子节点下标
int right; // 右子节点下标
};
```
2. 定义一个数组来存储哈夫曼树的所有结点,数组大小为 $2n-1$,其中 $n$ 为叶子结点的个数。
```c
struct HuffmanNode huffmanTree[2 * n - 1];
```
3. 初始化哈夫曼树的叶子结点,即将权值存入数组中,并将父节点、左右子节点下标初始化为 -1。
```c
for (int i = 0; i < n; i++) {
scanf("%d", &huffmanTree[i].weight);
huffmanTree[i].parent = -1;
huffmanTree[i].left = -1;
huffmanTree[i].right = -1;
}
```
4. 构造哈夫曼树,即重复以下步骤 $n-1$ 次:
1. 在所有未被选中的结点中,选择权值最小的两个结点作为左右子节点,将它们的权值相加作为它们的父节点的权值。
2. 将新生成的父节点插入到数组中,并将它的左右子节点下标指向它的两个子节点,将它的两个子节点的父节点下标指向它。
3. 将选中的两个结点的父节点下标指向新生成的父节点。
```c
for (int i = n; i < 2 * n - 1; i++) {
int min1 = -1, min2 = -1;
for (int j = 0; j < i; j++) {
if (huffmanTree[j].parent == -1) {
if (min1 == -1 || huffmanTree[j].weight < huffmanTree[min1].weight) {
min2 = min1;
min1 = j;
} else if (min2 == -1 || huffmanTree[j].weight < huffmanTree[min2].weight) {
min2 = j;
}
}
}
huffmanTree[min1].parent = i;
huffmanTree[min2].parent = i;
huffmanTree[i].left = min1;
huffmanTree[i].right = min2;
huffmanTree[i].weight = huffmanTree[min1].weight + huffmanTree[min2].weight;
}
```
5. 哈夫曼树构造完成后,可以通过遍历哈夫曼树来获取每个叶子结点的编码。
```c
for (int i = 0; i < n; i++) {
int j = i;
while (huffmanTree[j].parent != -1) {
if (huffmanTree[huffmanTree[j].parent].left == j) {
printf("0");
} else {
printf("1");
}
j = huffmanTree[j].parent;
}
printf("\n");
}
```