天天看点

huffman tree的构造代码如何保证其带权路径长度为最小

第一张图是代码,第二张图是代码的核心思想“将权值最小的两个二叉树合并”,和代码联系起来,就是,我用第三张图中的1234567作为七个叶结点,把权值最小的两个结点,也就是1和2作为两个子结点,链接成一个新的二叉树,并把他们的父结点表示为1和2的和,也就是3。此时的3同时也是非叶结点,然后把3看作新的要链接的结点,与剩下的34567作比较,

再把最小的3和3链接成一个二叉树,同时把他们的父结点表示为3+3=6,又把6与4567比较,此时4和5最小,所以4和5链接,其父结点表示为9,如此继续下去,直到最后成为了根结点为28的哈夫曼树,哈夫曼树的构造过程就是这样,既然是哈夫曼树,那么问题来了,为什么他的带权路径长度就是最小的呢?

1234567这几个数字就是权,从根节点到每一个叶结点的线段边的条数就是路径,wpl就是带权路径长度,就是每个叶结点的权*路径的值的总和。

我直接说规律,最后的wpl就是非叶结点的值的总和,就是上面第三张图的3+6+12+9+16+28的和就是上述哈夫曼树的wpl,怎么来的有兴趣自己研究,这里就不废话了。

重点是为什么这和是最小的,根据哈夫曼树的性质,n个叶结点就会伴随n-1个非叶结点,而每个非叶结点的值都为两个叶结点的和,或者两个非叶结点的和,或者一个叶结点一个非叶节点的和,有1234567 这七个叶结点就会加出六个非叶结点,根据代码核心思想将最小的两个结点加成非叶结点,就可以保证每次得到的非叶结点都会是权值最小的,因而所有非叶结点的权值和就是最小的

huffman tree的构造代码如何保证其带权路径长度为最小
huffman tree的构造代码如何保证其带权路径长度为最小
huffman tree的构造代码如何保证其带权路径长度为最小

继续阅读