哈夫曼树及哈夫曼编码

概念

在这里插入图片描述

typedef struct TreeNode* HuffmanTree;
struct TreeNode{
   int weight;
   HuffmanTree Left,Right;
};
typedef struct HNode* Heap;
struct HNode{
    HuffmanTree Elements;
    int Size;
    int Capacity;
};
HuffmanTree Huffman(Heap H)
{/* 假设H->Size个权值已经存在H->Elements[]->Weight里 */ 
    int i;
    HuffmanTree T;
    BuildMinHeap(H);//调整H为最小堆
    for(i=1;i<H->Size;i++){//做H->Size-1次合并
       T=(HuffmanTree)malloc(sizeof(struct TreeNode));
       T->Left=DeleteMinHeap(H);
       T->Right=DeleteMinHeap(H);
       T->weight=T->Left->weight+T->Right->weight;
       Insert(H,T);
    }
    T=DeleteMinHeap(H);
    return T;
}  
哈夫曼树的特点
  1. 没有度为1的结点
  2. 有n个叶子结点的哈夫曼树共有2n-1个结点
  3. 哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树
  4. 对同一组权值{w1 ,w2 , …… , wn},存在不同构的两棵哈夫曼树
哈夫曼编码
  • 为节省空间,可进行不等长编码(如根据频率高低)
  • 在不等长编码时要注意避免编码的二义性
  • 避免二义性的方法:使用前缀码(prefix code:任何字符的编码都不是另一字符编码的前缀)可以无二义地解码
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值