哈夫曼树构造

1.哈夫曼树的定义

    给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。

2.哈夫曼树的构造

    假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1,w2,…,wn,则哈夫曼树的构造规则为:

(1) 将w1,w2,…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为我们所求得的哈夫曼树。

    下面给出哈夫曼树的构造过程,假设给定的叶子结点的权分别为1,5,7,3,则构造哈夫曼树过程如图所示。 从图中可知,n 个权值构造哈夫曼树需n-1次合并,每次合并,森林中的树数目减1,最后森林中只剩下一棵树,即为我们求得的哈夫曼树。

哈夫曼树构造算法的正确性证明_第1张图片

哈夫曼构造正确性证明。

如上图,WPL值为3×(1+3)+2×5+1×7=29.

事实上WPL值也是所有非叶子节点的和,即4+9+16=29.

这是可以证明的。

从最底层开始计算,最底层的2个叶节点的根结点的值为叶节点的和,每个根结点都为叶节点的和,也就是说,每个非叶节点的值都是它底下所有的叶节点的和。比如16=1+3+5+7,9=1+3+5。因此把4,9,16这些节点加起来,就相当于底层节点1,3加了3遍,5加了2遍,7加了1遍。即每个值加的遍数就是该值的深度。

又因为根据算法,n个叶子节点所组成的一个集合,每次取走2个最小节点,再加入一个节点,直到只剩下最后一个节点。因此,新生成的叶子非叶子节点个数必定是n-1个。因此要保证WPL值最小,也就是保证生产的非叶子节点和最小,即生成的节点和值最小。因此每次生成的节点取最小值,即可保证,总的和值是最小的。即WPL值也是最小的。