Huffman Tree的定义
带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子节点带有权值wk,从根节点到每个叶子结点的长度为lk,则每个叶子节点的带权路径长度之和
最优二叉树或哈夫曼树:WPL最小的树
实际意义:根据结点不同的查找频率构建更有效的搜索树
Huffman Tree的构造
每次把权值最小的两棵二叉树合并
typedef struct TreeNode *HuffmanTree;
struct TreeNode{
int Weight;
HuffmanTree Left, Right;
};
HuffmanTree Huffman( MinHeap H ){
/*假设H->Size个权值已经存在H->Elements[]->Weight里*/
int i;
HuffmanTree T;
BuildMinHeap( H );/**/
for ( i = 1; i < H -> Size; ++i){
T = malloc( sizeof (struct TreeNode ) );
T->Left = DeleteMin( H );
T->Right = DeleteMIn( H );
T->Weight = T->Left->Weight + T->Right->Weight;
Insert( H, T );
}
T->DeleteMin(H);
return T;
}
Huffman Tree的特点
没有度为1的结点
任一字符的编码串都不是另一字符编码串的前缀(因为根通往任一叶子结点的路径不可能是通往其余叶子结点的子路径)
n个叶子结点的Huffman Tree共有2n-1个结点
Huffman Tree的任意非叶结点的左右子树交换后仍是Huffman Tree
对同一组权值,存在两棵不同构的Huffman Tree,但是WPL值相同
Huffman Code
在进行不等长编码时,利用前缀码避免二义性,同时能节省存储空间
前缀码prefix code:任何字符的编码都不是另一字符编码的前缀(可以无二义地解码)
二叉树用于编码时:左右分支分别为01,字符仅在叶结点上
构造一棵编码代价最小的二叉树
为五个使用频率不同的字符设计哈夫曼编码,下列方案中哪个不可能是哈夫曼编码?
- A.
00,100,101,110,111 - B.
000,001,01,10,11 - C.
0000,0001,001,01,1 - D.
000,001,010,011,1
正确答案:A你选对了
技巧:任一字符的编码串都不是另一字符编码串的前缀(因为根通往任一叶子结点的路径不可能是通往其余叶子结点的子路径)
Haffman树的结点的度为0/2,不可能为1
一段文本中包含对象{a,b,c,d,e},其出现次数相应为{3,2,4,2,1},则经过哈夫曼编码后,该文本所占总位数为:
- A.
12 - B.
27 - C.
36 - D.
其它都不是
正确答案:B你错选为D
Huffman n 叉树
赫夫曼n叉树是赫夫曼二叉树的一种特例,对于节点数目大于大于等于2的待处理序列,都可以构造赫夫曼二叉树,但是不一定能构造n叉树。当发现无法构造时,需要补上权值为0的结点(因为构造的目的是最小的WPL,0权值点无影响)