哈夫曼树 Huffman tree 原理
2013-09-13 11:46
302 查看
1. 哈夫曼树的基本概念
哈夫曼树( Huffman )又称最优二叉树,是一类带权路径长度最短的树,有着广泛的应用。
在讨论哈夫曼树之前首先需要弄清楚关于路径和路径长度的概念。树中两个结点之间的路径由一个结点到另一结点的分支构成。两结点之间的路径长度是路径上分支的数目。树的路径长度是从根结点到每一个结点的路径长度之和。
设一棵二叉树有 n 个叶子结点,每个叶子结点拥有一个权值W 1 ,W 2 , ...... W n ,从根结点到每个叶子结点的路径长度分别为 L1 , L2......Ln ,那么树的带权路径长度为每个叶子的路径长度与该叶子权值乘积之各。通常记作 WPL = L k. W k 。为了直观其见,在图中把带权的叶子结点画成方形,其他非叶子结点仍为圆形。请看图 6.21 中的三棵二叉树以及它们的带权路径长。
(a) wpl=38 (b) wpl=49 (c) wpl=36 图 6.21 具有不同带权路径长度的二叉树
注意:
这三棵二叉树叶子结点数相同,它们的权值也相同,但是它们的 wpl 带权路径长各不相同。图 6.21(c)wpl 最小。它就是哈曼树,最优树。哈夫曼树是,在具有同一组权值的叶子结点的不同二叉树中,带权路径长度最短的树。也称最优树。
2. 哈夫曼树的构造
构造哈夫曼树的方法
对于已知的一组叶子的权值W 1 ,W 2...... ,W n
①首先把 n 个叶子结点看做 n 棵树(仅有一个结点的二叉树),把它们看做一个森林。
②在森林中把权值最小和次小的两棵树合并成一棵树,该树根结点的权值是两棵子树权值之和。这时森林中还有 n-1 棵树。
③重复第②步直到森林中只有一棵为止。此树就是哈夫曼树。现给一组 (n=4) 具体的权值 2 , 4 , 5 , 8 ,下边是构造具体过程:
图 6.22 哈夫曼树构造过程
图 6.22(a) 是一个拥有 4 棵小树的森林,图 6.22(b) 森林中还有 3 子棵树,图 6.22(c) 森林中剩下 2 棵树,图 6.22(d) 森林只有一棵树,这棵树就是哈夫曼树。这里或许会提出疑问, n 个叶子构成的哈夫曼树其带权路径长度唯一吗?确实唯一。树形唯一吗?不唯一。因为将森林中两棵权值最小和次小的子棵合并时,哪棵做左子树,哪棵做右子树并不严格限制。图 6.22 之中的做法是把权值较小的当做左子树 , 权值较大的当做右子树。如果反过来也可以,画出的树形有所不同,但 WPL 值相同。为了便于讨论交流在此提倡权值较小的做左子树
, 权值较大的做右子
相关文章推荐
- 哈夫曼树(Huffman tree)->一种二叉树
- 树-哈夫曼树(Huffman Tree)
- 哈夫曼树(Huffman Tree) 实现
- 数据结构基础5.5:哈夫曼树(HuffmanTree)的构造
- 哈夫曼树(Huffman Tree)
- 数据结构.哈夫曼树(HuffmanTree)
- 哈夫曼树(Huffman Tree)与哈夫曼编码
- 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
- Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)
- (哈夫曼树)HuffmanTree的java实现
- Java实现哈夫曼树(HuffmanTree)
- KD-tree的原理以及构建与查询操作的python实现
- HuffmanTree以及其编码
- Atitit。Tree文件解析器的原理流程与设计实现 java c# php js
- B+/-Tree原理及mysql的索引分析
- 霍夫曼树(Huffman tree) 编码及解码——小根堆的应用
- 树结构(四) - 哈夫曼树的原理与实现
- B-Tree作为索引能够提高查询效率的原理
- Huffman Tree、AVL、SplayTree、Skip List、2-3-4 Tree、rb-Tree、B-Tree特性辨析与总结
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路