霍夫曼树,也叫最优二叉树。
什么是最优二叉树呢,所谓最优二叉树是指带权路径长度最短的树。那么为什么霍夫曼算法构建的是一棵最优二叉树?也就是它如何保证树的带权路径值最小呢?
下面来说明一下。
首先,在最优二叉树中,除了叶结点,其他结点(叫它内结点吧)都有两个孩子,如若不然,比如有一个内结点只有一个孩子,那么把这个结点和它的孩子结点压缩成一个结点,树的带权路径值减小了,因此原树就不是最优二叉树了。根据这个特点,容易推导出来,内结点个数等于叶子结点个数减1(推导过程:2n2 = n0 + n2 - 1,因此有n2 = n0 - 1)
其次,可以证明两个权值最小的结点都在最优树的最深层。这里给出一个数学证明。
假设有两个叶结点n1和n2,n1的权值为w1,所处深度为l1,n2的权值为w2,所处深度为l2,树的带权路径值为H= c + w1*l1 + w2*l2,如果交换两个结点位置,那么树的带权路径长度值为H’ = c + w1*l2 + w2*l1,如果交换之后树的带权路径值变大了,则有H’ > H,也就是c + w1*l1 + w2*l2 < c + w1*l2+w2*l1,化简一下有w1*(l1 - l2) < w2*(l1 - l2),如果l1 > l2,则w1 < w2,如果l1 < l2则w1 > w2,无论是哪种情况,都是把一个深度大权值小的叶结点和一个深度小权值大的叶结点交换,可见当把一个深度大权值小的叶结点和一个深度小权值大的叶结点换位置,树的带权路径值变大了,树变得糟糕了一些。因此权值小的叶结点应该在树的最深层,从自顶向下的角度看也就是最底层。并且这样的结点是成对出现的,因为内结点都有两个孩子。
通过上面的逻辑推理只解决了霍夫曼算法的第一步,也就是挑出来两个权值最小的结点,作为树最底层的两个互为兄弟的叶子结点,但后续的递归过程又是怎么来的?
假设树的最底层有两个结点n1和n2,它的双亲结点为n0,n1的权值为w1,n2的权值为w2,设树的带权路径长度H,我们对树做个处理,把n1和n2拿掉,得到一棵新的树,n0变成了叶结点,我们令n0的权值为w1 + w2,新树的带权路径长度为H’,则有H = H’ + w1 + w2,为了使H最小,就得使H’最小,也就是要使新树也是最优二叉树,那么在构建新树的时候也要取权值最小的两个叶结点为最底层结点。这就是霍夫曼算法的递归过程的原理。