给定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.bilibili.com/video/av19665344/?p=93