c语言横向输出哈夫曼树
时间: 2023-10-13 20:04:51 浏览: 132
c语言实现的哈弗曼树
首先需要构建一棵哈夫曼树,然后进行横向输出。以下是C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 定义哈夫曼树结点
typedef struct {
int weight; // 权值
int parent; // 双亲结点下标
int leftChild; // 左孩子结点下标
int rightChild; // 右孩子结点下标
} HTNode, *HuffmanTree;
// 构造哈夫曼树
void createHuffmanTree(HuffmanTree HT, int n) {
int i, j;
// 初始化哈夫曼树
for(i = 0; i < 2 * n - 1; i++) {
HT[i].parent = -1;
HT[i].leftChild = -1;
HT[i].rightChild = -1;
}
// 输入每个叶子结点的权值
for(i = 0; i < n; i++) {
printf("请输入第%d个叶子结点的权值:", i+1);
scanf("%d", &HT[i].weight);
}
// 构建哈夫曼树
for(i = n; i < 2 * n - 1; i++) {
int min1 = MAX_SIZE, min2 = MAX_SIZE;
int left = -1, right = -1;
// 找出权值最小的两个结点
for(j = 0; j < i; j++) {
if(HT[j].parent == -1) {
if(HT[j].weight < min1) {
min2 = min1;
right = left;
min1 = HT[j].weight;
left = j;
} else if(HT[j].weight < min2) {
min2 = HT[j].weight;
right = j;
}
}
}
// 合并成新的结点
HT[i].weight = HT[left].weight + HT[right].weight;
HT[i].leftChild = left;
HT[i].rightChild = right;
HT[left].parent = i;
HT[right].parent = i;
}
}
// 横向输出哈夫曼树
void printHuffmanTree(HuffmanTree HT, int n) {
int i, j, k;
for(i = 0; i < n; i++) {
printf("%d: ", i);
for(j = 0; j < HT[i].weight; j++) {
printf("*");
}
printf("\n");
k = HT[i].parent;
while(k != -1) {
if(i == HT[k].leftChild) {
printf("│ ");
} else {
printf(" ");
}
k = HT[k].parent;
}
}
}
int main() {
HuffmanTree HT;
int n;
printf("请输入叶子结点的个数:");
scanf("%d", &n);
// 动态分配哈夫曼树结点
HT = (HuffmanTree)malloc(sizeof(HTNode) * (2 * n - 1));
createHuffmanTree(HT, n);
printHuffmanTree(HT, n);
free(HT);
return 0;
}
```
这段代码中,首先定义了哈夫曼树结点的结构体HTNode和指向结点的指针HuffmanTree。然后定义了函数createHuffmanTree用于构造哈夫曼树,输入每个叶子结点的权值,计算出每个结点的权值和父子关系。接着定义了函数printHuffmanTree用于横向输出哈夫曼树,输出每个结点的权值和对应数量的星号,并且根据父子关系输出水平线和竖直线。最后在主函数中动态分配哈夫曼树结点、调用创建函数和输出函数、释放内存。
阅读全文