用C语言实现哈夫曼树的建立算法,输入一个有n个叶结点的权值构造一棵哈夫曼树,节点应该存储四种信息:结点的权值,左右子树的地址,及双亲结点地址
时间: 2024-03-26 20:42:08 浏览: 50
好的,以下是C语言实现哈夫曼树的建立算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEAF_NUM 50
// 定义哈夫曼树节点结构体
typedef struct node {
int weight; // 节点权值
struct node *left; // 左子树地址
struct node *right; // 右子树地址
struct node *parent; // 双亲节点地址
} Node;
// 定义哈夫曼树结构体
typedef struct huffman_tree {
int leaf_num; // 叶子节点数
Node *root; // 根节点地址
} HuffmanTree;
// 从n个节点的权值数组w中构建哈夫曼树
void create_huffman_tree(int *w, int n, HuffmanTree *ht) {
if (n <= 1) {
return; // 只有一个节点或没有节点,不需要构建哈夫曼树
}
Node *nodes[MAX_LEAF_NUM * 2];
for (int i = 0; i < n; i++) {
Node *node = (Node*)malloc(sizeof(Node));
node->weight = w[i];
node->left = NULL;
node->right = NULL;
node->parent = NULL;
nodes[i] = node;
}
int node_num = n;
while (node_num > 1) {
// 找到权值最小的两个节点
int min1, min2;
min1 = min2 = -1;
for (int i = 0; i < node_num; i++) {
if (nodes[i]->parent == NULL) {
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;
}
}
}
// 创建新节点
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->weight = nodes[min1]->weight + nodes[min2]->weight;
new_node->left = nodes[min1];
new_node->right = nodes[min2];
new_node->parent = NULL;
nodes[min1]->parent = new_node;
nodes[min2]->parent = new_node;
nodes[node_num] = new_node;
node_num++;
}
ht->root = nodes[node_num - 1];
ht->leaf_num = n;
}
// 打印哈夫曼树
void print_huffman_tree(Node *node) {
printf("%d", node->weight);
if (node->left != NULL || node->right != NULL) {
printf("(");
if (node->left != NULL) {
print_huffman_tree(node->left);
}
printf(",");
if (node->right != NULL) {
print_huffman_tree(node->right);
}
printf(")");
}
}
int main() {
int w[] = {5, 4, 3, 2, 1};
int n = 5;
HuffmanTree ht;
create_huffman_tree(w, n, &ht);
print_huffman_tree(ht.root);
return 0;
}
```
该示例代码实现了从n个节点的权值数组中构建哈夫曼树,并且打印出构建好的哈夫曼树的形状。您可以根据自己的需要进行修改和扩展。
阅读全文