哈夫曼树及其应用
哈夫曼树的概念
路径:从一个结点到另一个结点之间的分支序列
路径长度:从一个结点到另一个结点所经过的分支数目
结点的权:根据应用的需要可以给树的结点赋权值
带权路径长度:从根到该结点的路径长度与该结点权的乘积
树的带权路径长度:树中所有叶子结点的带权路径之和
哈夫曼树:由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树
示例:有4个结点,权值分别为7,5,2,4,构造有4个叶子结点的二叉树
构造哈夫曼树
1)初始化:根据给定的n个权值 ,构造n棵只有一个根结点的二叉树, n个权值分别是这些二叉树根结点的权;
2)找最小树:在F中选取两棵根结点树值最小的树作为左、右子树,构造一颗新的二叉树,置新二叉树根的权值为左、右子树根结点权值之和;
3)删除与加入:从F中删除这两颗树,并将新树加入F;
4)判断:重复2)和3),直到F中只含一颗树为止,此时得到的这颗二叉树就是哈夫曼树。
示例:w={5,29, 7, 8, 14, 23, 3, 11}
哈夫曼编码
前缀码:如果在一个编码系统中,任一个编码都不是其他任何编码的前缀,则称该编码系统中的编码是前缀码。例如,一组编码01,001,010,100,110就不是前缀码,因为01是010的前缀,若去掉01或010就是前缀码。
哈夫曼编码:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的通路上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。
哈夫曼编码是最优前缀码。