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;

基础工具函数

  1. 创建哈夫曼节点,为每个权值创建一个独立的叶子节点,初始时没有左右子树,编码为空。
    HuffmanNode* createHuffmanNode(int weight){
    HuffmanNode node = (HuffmanNode)malloc(sizeof(HuffmanNode));
    node->left = node->right = NULL; // 初始化为空指针
    node->weight = weight; // 设置权值
    node->code[0] = '\0'; // 初始化编码为空字符串
    return node;
    }
  2. 创建最小堆,创建一个指定容量的空堆,后续会用来存放哈夫曼节点。
    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;
    }

posted on 2025-12-04 09:30  才一斤  阅读(0)  评论(0)    收藏  举报

导航