姓名:周小蓬 16019110037
转载自:http://blog.csdn.net/F__shigang/article/details/65442550
[嵌牛导读]
Huffman树是一类带权路径长度WPL最短的二叉树,中文名叫哈夫曼树或最优二叉树。
相关概念:
结点的路径长度:从根结点到该结点的路径上分支的数目。
树的路径长度:树中每个结点的路径长度之和。
树的带权路径长度:树中所有叶子结点的带权路径长度之和。
[嵌牛鼻子]
c语言
[嵌牛提问]
如何学习哈夫曼树以及步骤
[嵌牛正文]
构造Huffman树的步骤:
1) 根据给定的n个权值,构造n棵只有一个根结点的二叉树,n个权值分别是这些二叉树根结点的权;
2) 设F是由这n棵二叉树构成的集合,在F中选取两棵根结点权值最小的树作为左、右子树,构造成一颗新的二叉树,置新二叉树根结点的权值等于左、右子树根结点的权值之和。为了使得到的哈夫曼树的结构唯一,规定根结点权值最小的作为新二叉树的左子树。
3) 从F中删除这两棵树,并将新树加入F;
4) 重复2)、3)步,直到F中只含一棵树为止,这棵树便是Huffman树。
说明:n个结点需要进行n-1次合并,每次合并都产生一个新的结点,最终的Huffman树共有2n-1个结点。
2、Huffman编码
Huffman树在通讯编码中的一个应用:
利用哈夫曼树构造一组最优前缀编码。主要用途是实现数据压缩。在某些通讯场合,需将传送的文字转换成由二进制字符组成的字符串进行传输。
方法:
利用哈夫曼树构造一种不等长的二进制编码,并且构造所得的哈夫曼编码是一种最优前缀编码,使所传电文的总长度最短。
不等长编码:即各个字符的编码长度不等(如:0,10,110,011),可以使传送电文的字符串的总长度尽可能地短。对出现频率高的字符采用尽可能短的编码,则传送电文的总长度便尽可能短。
前缀编码:任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
二、代码实现
使用链表结构构建哈夫曼树并进行编码、解码,代码如下:
#include
#include
#include
typedefintELEMTYPE;
// 哈夫曼树结点结构体
typedefstructHuffmanTree
{
ELEMTYPE weight;
ELEMTYPE id;// id用来主要用以区分权值相同的结点,这里代表了下标
structHuffmanTree* lchild;
structHuffmanTree* rchild;
}HuffmanNode;
// 构建哈夫曼树
HuffmanNode* createHuffmanTree(int* a,intn)
{