2025/12/8
哈夫曼树哈夫曼编码
输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。
输入格式:
第一行输入叶子结点个数,接着依次输入权值。若叶子数为0或1,则输出error
输出格式:
输出哈夫曼编码,输出带权路径长度。
// 1. 哈夫曼树节点结构体
typedef struct HuffmanNode{
int weight; // 存储节点的权值
struct HuffmanNode *left; // 指向左子树的指针
struct HuffmanNode *right;// 指向右子树的指针
char code[20]; // 存储该节点(叶子节点)的哈夫曼编码
}HuffmanNode;
每个哈夫曼树节点包含权值、左右子树指针和编码。叶子节点的编码会被最终生成和保存,非叶子节点的编码无用。
// 2. 最小堆结构体
typedef struct MinHeap{
int size; // 当前堆中元素的数量
int capacity; // 堆的最大容量
HuffmanNode **array; // 存储哈夫曼节点指针的数组(堆的底层实现)
}MinHeap;
最小堆用于高效获取权值最小的节点,是构建哈夫曼树的关键工具。
// 3. 叶子节点结构体(用于排序输出)
typedef struct LeafNode{
int weight;
char code[20];
}LeafNode;
基础工具函数
- 创建哈夫曼节点,为每个权值创建一个独立的叶子节点,初始时没有左右子树,编码为空。
HuffmanNode* createHuffmanNode(int weight){
HuffmanNode node = (HuffmanNode)malloc(sizeof(HuffmanNode));
node->left = node->right = NULL; // 初始化为空指针
node->weight = weight; // 设置权值
node->code[0] = '\0'; // 初始化编码为空字符串
return node;
} - 创建最小堆,创建一个指定容量的空堆,后续会用来存放哈夫曼节点。
MinHeap* createMinHeap(int capacity){
MinHeap heap = (MinHeap)malloc(sizeof(MinHeap));
heap->size = 0; // 初始大小为0
heap->capacity = capacity; // 设置最大容量
heap->array = (HuffmanNode**)malloc(capacity * sizeof(HuffmanNode*));
return heap;
}
浙公网安备 33010602011771号