输入方式为读取以空格为间隙的一串数字,直到读取到#为止,然后构造对应的哈夫曼树,并打印出来。 下面是具体代码。
#include <stdio.h>
#include <stdlib.h>
// 定义树节点
typedef struct Node {
int value;
struct Node* left;
struct Node* right;
} Node;
// 创建树节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->value = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 构造哈夫曼树
Node* buildHuffmanTree(int* freq, int n) {
// 创建叶子节点数组
Node** nodes = (Node**)malloc(n * sizeof(Node*));
for (int i = 0; i < n; i++) {
nodes[i] = createNode(freq[i]);
}
// 构建哈夫曼树
while (n > 1) {
// 找到频率最小的两个节点
int min1 = 0;
int min2 = 1;
if (nodes[min1]->value > nodes[min2]->value) {
int temp = min1;
min1 = min2;
min2 = temp;
}
for (int i = 2; i < n; i++) {
if (nodes[i]->value < nodes[min1]->value) {
min2 = min1;
min1 = i;
} else if (nodes[i]->value < nodes[min2]->value) {
min2 = i;
}
}
// 创建新节点,将频率最小的两个节点作为子节点
Node* newNode = createNode(nodes[min1]->value + nodes[min2]->value);
newNode->left = nodes[min1];
newNode->right = nodes[min2];
// 删除已合并的节点
nodes[min1] = newNode;
nodes[min2] = nodes[n - 1];
n--;
}
// 返回根节点
Node* root = nodes[0];
free(nodes);
return root;
}
// 释放树节点的内存
void freeTree(Node* root) {
if (root == NULL) {
return;
}
freeTree(root->left);
freeTree(root->right);
free(root);
}
int main() {
int freq[100];
int n = 0;
int num;
// 读取输入的数字序列
printf("请输入数字序列(以空格分隔,以#结尾):");
while (scanf("%d", &num) == 1) {
freq[n++] = num;
if (getchar() == '#') {
break;
}
}
// 构造哈夫曼树
Node* root = buildHuffmanTree(freq, n);
// 输出哈夫曼树的结构
printf("Huffman Tree:\n");
printf(" %d\n", root->value);
printf(" / \\\n");
printf(" %d %d\n", root->left->value, root->right->value);
printf(" \\ \\ \n");
printf(" %d %d\n", root
printf(" \\ \\ \n");
printf(" %d %d\n", root->left->right->value, root->right->right->value);
// 释放内存
freeTree(root);
return 0;
}