5.4 哈夫曼树
路径长度:从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称作路径长度。
树的路径长度是从树根到每一个结点的路径长度之和。完全二叉树是这种路径长度最短的二叉树。
结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子节点的带权路径长度之和,通常记作WPL。
赫夫曼树:带权路径长度WPL最小的二叉树称作最优二叉树或赫夫曼树。
赫夫曼算法:
(1)根据给定的n个权值{w1,w2,...wn}构成二叉树的集合F={T1,T2...Tn},其中每棵Ti中只有一个带权为wi的根节点,其左右子树均空。
(2)在F中选取两棵根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左右子树上根节点的权值之和。
(3)在F中删除这两棵树,同时将新得到的二叉树加入F中。
(4)重复(2)和(3),直到F只含一棵树为止。这棵树就是哈夫曼树。
赫夫曼树主要应用:赫夫曼编码
赫夫曼编码默认从根节点开始 左0右1,但是只要哈夫曼树里面每个节点的左右不出现两个都是1或者两个都是0的情况,就不会出现多种译法的情况
赫夫曼算法示例:
3 5 7 8 11 14 23 29
(1)从最小的两个开始 以此相加结果作为父节点 5 3 最小 和 8 作为5 3的父节点
7 8 8 11 14 23 29
(2)然后 7 8 最小 和15作为7 8 的父节点
8 11 14 15 23 29
(3) 8 11 和19作为父节点
14 15 19 23 29
.........