首先列出证明过程中需要的名词:
1.路径长度:从某一个结点到根结点的这条路径上的分支数目为路径长度。
2.结点的带权路径长度:从该结点到树根之间的路径长度与该结点的权值乘积。
3.树的带权路径长度:树中所有叶子结点的带权路径长度之和。
一般记作 :
4.使带权路径长度最小的树称作:最优树或哈夫曼树。
证明:
假设:有一带权分别为的最优树
。
设:的最大路径长度的分支节点为
,通路长度为
。
因为为分支结点,因此一定有子结点。
当只有一个子结点时,容易知道不是最优树可继续优化,因此
一定有两结点。
设这两个结点的权值分别为。
则的带权路径长度为:
易得的带权路径长度:
当交换结点与
后:
,
除去与
,其余结点不变,树
的带权路径长度为
那么交换前:
交换后:
相减得:
又因为是最优树,即:
是最小的带权路径。
可得:
因此要使上式成立,则有:
或:
(
是兄弟)
同理可得:
或
是兄弟
综上所述:
结论一:最优树的 最大路径长度分支结点 下的两个子结点是所有结点中权值最小的两个结点。
现在回忆一些不考虑树的结构,只考虑结点合并的哈夫曼算法构造最优树的过程。
即:每次选择权值最小的两个结点进行合并
对于权值为的n个结点,经过n-1次合并
最终得到两个结点
对于两个结点容易得到最优树,即:这两个节点为根节点孩子的树。
接下来按合并的顺序反向展开,
利用数学归纳法证明:
假设:第m-1次展开得到的树是最优树成立
当 m = 2 时结论成立。
接下来证明m次展开得到的树是最优树。
第m次反向展开得到树。
而对于第m次展开得到的树中有
m+1个结点
其中是路径长度最大分支节点的子结点(由结论一得)。
所以有:
存在由这m+1个节点构成的的最优树,设为。
将路径长度最大分支结点的子结点合并到分支节点上(即:分支结点变为叶子结点权值为子结点权值之和),得到
。
再由结论一得:合并的结点为。
因此:
两式相加得:
因为,
最优,有:
,
因此要使上面两式同时成立,必须有:
也就是说:
第m次反向展开得到的树是最优树。
所以假设成立,因此第n-1次展开得到的树是最优树
。
而按照上述步骤最终得到的树就是哈夫曼算法得到的树。
所以综上:哈夫曼算法得到的树是最优树。