一、哈夫曼树(最优二叉树)定义:
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
首先搞清楚基本术语:
1、路径和路径长度
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
在哈夫曼树中,只需要关注根节点与叶子节点之间的路径即可。
2、结点的权及带权路径长度
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
3、树的带权路径长度
树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(Weighted Path Length of Tree)。
WPL=14+6=20
二、构建哈夫曼树(考点,也是生成哈夫曼编码的基础)
给定这样的场景:给出5个节点,构建一颗带权路径长度最短的树。这里有一个原则:权值越大,则应该距离根节点越接近。这样可以减小WPL(树的带权路径长度)。
注意:兄弟结点的位置跟权的大小没有关系!左右孩子谁大谁小都可以,上图中的权重2,3 的两个节点位置可以互换,根节点下两颗子树也能左右互换。