给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
哈弗曼树的基本概念思路: 五个叶子的权值是 9 1 3 5 6 (1) 将权值从小到大排序后是 1 3 5 6 9 (这是有序序列) (2) 每次提取最小的两个节点,取节点1和节点3,组成新节点N4,其权值=1+3=4, 节点1的数值较小,作为左分支,节点3就作为右分支. (3) 将新节点N4放入有序序列,保持从小到大排序: N4 5 6 9 (节点1和3已经提取掉) (4) 重复步骤(2),提取最小的两个节点,N4与节点5组成新节点N9,其权值=4+5, N4的数值较小,作为左分支,节点5就作为右分支. (5) 将新节点N9放入有序序列,保持从小到大排序: 6 9 N9 (注意,要将新节点N9排在后,如果顺序是 6 N9 9 则会有不同的结果) (6) 重复步骤(2),完成剩下的节点,最后,得到"哈夫曼树": N24 / \ N9 N15 / \ / \ N4 5 6 9 / \ 1 3 根节点N24到节点9的路径长度是2,节点9的带权路径长度是9*2 根节点N24到节点6的路径长度是2,节点6的带权路径长度是6*2 如此类推,可以得出其它节点的带权路径长度. 所以,哈夫曼树的带权路径长度WPL等于 9*2 + 6*2 + 5*2 + 3*3 + 1*3 = 52 哈夫曼编码: 规定哈夫曼树的左分支代表0,右分支代表1. 从根节点N24到节点9,先后经历两次右分支,节点9的编码就是11 从根节点N24到节点6,先经历右分支,再经历左分支,节点6的编码就是10 从根节点N24到节点5,先经历左分支,再经历右分支,节点5的编码就是01 如此类推,可以得出所有的节点的"哈夫曼编码": 权值9: 11 权值6: 10 权值5: 01 权值3: 001 权值1: 000
转载于:https://www.cnblogs.com/zoulingjin/p/8676700.html