天天看点

算法基础(八):超详细最优二叉树构建(1)

赫夫曼(huffman)树也称最有二叉树,是一类带全路径长度最短的树,有着广泛的应用。比如一棵判定树,根据学生的成绩划分及格还是不及格还是优、中等、良好。显然用if-else或者switch就可以简单实现,当然可以直接毫不考虑的直接这样写,但是如果我们再肯花点功夫,就可以得到更加高效的程序。我们可以以学生的总的学科分数的占的各个分数段的比率为权,构造一棵赫夫曼树,这样可以减少比较次数,提高程序运行效率。

构造赫夫曼树的方法步骤其实很简单--赫夫曼算法:

(1).

根据给定的n个权值{w1,w2,w3...,wn}构成n棵二叉树的集合f = {t1,t2,....tn},其中每棵二叉树ti中只有一个带权的wi的根节点,其左右子树为空。

(2).

在f中选取两棵根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左、右子树上根节点的权值之和。

(3).

在f中删除这两棵树,同时将新得到的二叉树加入到f中。

(4).

重复(2)、(3),知道f中含一棵树为止。

下面是构造huffmantree的代码实现:

下面是main函数的测试:

运行结果:

算法基础(八):超详细最优二叉树构建(1)

图2:

算法基础(八):超详细最优二叉树构建(1)

说明:其实根据上面的权值,树有多种,但是wpl都是一样的。

继续阅读