课本中没有证明,现补充在这里。改编自下面的证明链接(英文)
http://algoviz.org/OpenDSA/Books/OpenDSA/html/HuffProof.html
[ 感谢N_thread指出的问题。]
====================
引理1:给定W = {w1, w2, w3...,wn} (n >= 2), 以此集合构建相应的哈夫曼树。令wi, wj 是W中权重最小的两个元素,则这两个数对应的结点是兄弟结点,且这两结点在二叉树中的深度不小于其它任何一个叶结点的深度。
证明:由哈夫曼树的构建过程可知,wi, wj 所在结点是兄弟结点(在不影响阅读的前提下,以wi, wj 指代这两个结点)。假设在哈夫曼树中,wi, wj 所在结点的深度不是最深的,则哈夫曼树应似图1 样式,存在一些结点,其深度大于wi, wj 的深度。在图1中,wi, wj的父结点V的权重应大于结点X权重,否则构建哈夫曼树时,应选择V而不是X作为U的子结点。但这是不可能的,因为由假设知wi, wj是W中权重最小的两个元素。得出矛盾,问题得证。
图1 一棵可能的哈夫曼树,在此树中,对于最小权重的的两个叶结点wi,wj, 其深度是不同的。图中三角形表示子树。
定理1:哈夫曼树是最优的。
证明:用归纳法证明。
(注意:哈夫曼编码是最优之一。)