树结构_哈夫曼树 发表于 2021-07-25 分类于 数据结构 阅读次数: Valine: 本文字数: 887 阅读时长 ≈ 1 分钟 结构 HTNode - PtrToHTNode - HuffmanTree 权重 左哈夫曼树 右哈夫曼树 从最小堆构造哈夫曼树 假设H->Size个权值已经存在H->Elements[]->Weight里 将H->Elements[]按权值调整为最小堆 遍历所有元素 创建树结点,从小顶堆中最小值为左子树,再从堆取最小值为右子树 将左子树的权重加右子树的权重为根结点的权重 重新将新创建的根结点插入回小顶堆中 编码:1234567891011121314151617181920212223242526272829303132333435#include <stdlib.h>typedef struct HTNode *HuffmanTree;struct HTNode { // 1.权重 int Weight; // 2.左哈夫曼树 HuffmanTree Left; // 3.右哈夫曼树 HuffmanTree Right;};/** * 从最小堆构造哈夫曼树 */HuffmanTree HuffMan(MinHeap H) { // 1.假设H->Size个权值已经存在H->Elements[]->Weight里 int i; HuffmanTree T; // 2.将H->Elements[]按权值调整为最小堆 BuildMinHeap(H); // 3.遍历所有元素 for (i = 1; i < H->Size; i++) { // 4.创建树结点,从小顶堆中最小值为左子树,再从堆取最小值为右子树 T = malloc(sizeof(struct HTNode)); T->Left = DeleteMin(H); T->Right = DeleteMin(H); // 5.将左子树的权重加右子树的权重为根结点的权重 T->Weight = T->Left->Weight + T->Right->Weight; // 6.重新将新创建的根结点插入回小顶堆中 Insert(H, T); } T = DeleteMin(H); return T;}