5.哈夫曼树
5.1概念
哈夫曼树: 哈夫曼(Huffman )树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途。哈夫曼树的定义,涉及路径、路径长度、权等概念,下面先给出这些概念的定义,然后再介绍哈夫曼树。
(1) 路径: 从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
(2) 路径长度: 路径上的分支数目称作路径长度。
(3) 树的路径长度: 从树根到每一结点的路径长度之和。
(4) 权: 赋予某个实体的一个量,是对实体的某个或某些属性的数值化描述。在数据结构中,实体有结点(元素)和边(关系)两大类,所以对应有结点权和边权。结点权或边权具体代表什么意义,由具体情况决定。如果在一棵树中的结点上带有权值,则对应的就有带权树等概念
(5) 结点的带权路径长度: 从该结点到树根之间的路径长度与结点上权的乘积。
(6) 树的带权路径长度: 树中所有叶子结点的带权路径长度之和,通常记作WPL。
(7) 哈夫曼树: 假设有m个权值{W1,W2…,Wm},可以构造一棵含n个叶子结点的二叉树,每个叶子结点的权为w;则其中带权路径长度WPL最小的二叉树称做最优二叉树或哈夫曼树。
(8) 哈夫曼树中权越大的叶子离根越近;具有相同带权结点的哈夫曼树不唯一。
例1:下面树的带权路径长度是多少?
WPL=7×2+5×2+2×2+4×2=36
5.2构造哈夫曼树
步骤: 现由n个权值{w1,w2,w3,…wn}构造成的n棵二叉树的森林F={T1,T2, …
Tn}。
- 在F中选取权值最小和次小的两棵树,分别作为左右子树,权值之和作为新节点。
- 在F中删除作为左右子树的两棵树,并加入新生成的节点,再次比较。
- 重复1、2两个步骤。
例2:有5个结点a, b, c, d, e,权值分别为7,5,5,2,4,构造哈夫曼树。
注:1.包含n个叶子结点的哈夫曼树中共有2n-1个结点;要经过n-1次合并;
2.哈夫曼树的结点的度数为О或2,没有度为1的结点。
5.3哈夫曼编码
方法:
- 构造哈夫曼树。则概率越大的结点,路径越短。
- 在哈夫曼树的每个分支上标上O或1:
结点的左分支标0,右分支标1。 - 把从根到每个叶子的路径上的标号连接起来,作为该叶子代表的字符的编码。
例3:有n=8,要传输的字符集D={a,b,c,d,e,f,g,h},出现的频率分别为W={ 7,19,2,6,32,3,21,10},构造哈夫曼树。
例4:将例3中待传字符abcdefg转换成二进制的字符串。
5.4哈夫曼树的存储
步骤: 构造哈夫曼树,同时画出如下线性表。
注:采用顺序存储结构——一维数组;
哈夫曼树中结点下标共2n-1个。
HT终态