这是在做一道编程提示遇到的,学习了一位博主的编码,其中有些问题未能理解,分析解决掉。
首先什么是哈夫曼树:
哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树。
也就是根节点到节点的中的长度最小,当然条件就是,每条路径都是有权重的,
所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL= (W1*L1+W2*L2+W3*L3+…+Wn*Ln)
此时WPL=32×1+24×2+2×3+7×3
一般建立哈夫曼树的步骤为
1,将所有左,右子树都为空的作为根节点。
2,在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。
3,从森林中删除这两棵树,同时把新树加入到森林中。
4,重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。
太原理工网站给出了动画演示
http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/Huffman.asp
上面提到的根据权重排序,选出权重最小的两个,这个功能在优先队列中完全可以做到。所以在构建哈夫曼树时可以利用优先队列
然后看看题目吧
Input
The input file will contain a list of text strings, one per line. The text strings will consist only of uppercase alphanumeric characters and underscores (which are used in place of spaces). The end of the input will be signalled by a line containing only the word “END” as