赫夫曼树
【1】赫夫曼树基本概念
别名“最优树”,是一种带权路径最短的树。
(1)路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
(2)路径长度:路径上的分支数目。
(3)树的路径长度:从树根到一每结点的路径长度之和。
(4)结点的带权路径长度:从该结点到树根之间的路径长度与结点上权值的乘积。
(5)树的带权路径长度:树中所有叶子结点的带权路径长度之和。记作:WPL
【2】赫夫曼树的构造
(1)由给定的n个权值{W1,W2,…,Wn}构成n棵二叉树的集合F={T1,T2,…,Tn} 其中每棵二叉树Ti中只有一个带权为Wi的根节点,其左右子树均空。
(2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树。
这棵新的二叉树根结点的权值为其左、右子树根结点权值之和;
(3)在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中。
(4)重复(2)(3)两步,当F中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。
在构造赫夫曼树的时,尤其注意第三步,在F中删除所指的两棵树后,一定记住将新得到的二叉树加入F中。
例:设给定权集w = {5, 29, 7, 8, 14, 23, 3, 11},构造关于w的一棵赫夫曼树,并求其加权路径长度WPL。
在构造赫夫曼树的过程中,在第二次选择两棵权值最小树时,最小的两个作为左右子树的分别是7和8。
而此时的8有两种:一种是原来权值集中的,另一种是经过第一次构造出的新的二叉树的根的权值。如上图树1和树2所示。
所以,7与不同的8结合,便生成了不同的赫夫曼树,但是它们的WPL是相同的。计算过程如下:
树1:WPL = 2×23 + 3×(8+11) + 2×29 + 3×14 + 4×7 + 5×(3+5) = 271
树2:WPL = 2×23 + 3×11 + 4×(3+5)+ 2×29 + 3×14 + 4×(7+8) = 271
赫夫曼树编码图如下:
【3】赫夫曼树的实现
实现代码如下:
Good Good Study, Day Day Up.
顺序 选择 循环 总结