哈夫曼树与哈夫曼编码的实现
哈夫曼树是一种特殊的树,结合前面做书上 动态规划题 的了解,哈夫曼树就是最优二叉树。 建立一颗哈夫曼树前需要明确条件,比如一颗词典树(节点值为单词),我们希望能通过我们的查找习惯建立一颗更快、更合适的二叉树,那么,这里的条件就是树中每个单词的搜索频率,显然,搜索频率越高的单词越靠近树根,查找效率会更好,通过搜索频率(权值)与节点离根节点的路径距离计算出WPL(带权路径长),当词典树的形态为某种情况的时候(哈夫曼树总是一颗满二叉树 — 除叶节点外,内部节点都是儿孙满堂的),WPL最小,那么这样的一颗二叉树就是最优二叉树,也就是我们想要的树的形态了。 可通过动态规划算法证明,上面描述的二叉树的各个节点是否与最优二叉树的各节点相等。当然书上还有更严谨的数学证明。 WPL计算很简单,公式:WPL = ∑ L i × P i (其中L是路径长度,P是权值)。 建立哈夫曼树很简单:初始化节点数据,维护一个最小优先队列,将节点按权值大小加入到优先队列中,然后将队列中的节点弹出,由下而上建立哈夫曼树。 算法伪python代码: ''' class node: int f; //权值 type var; //其他数据类型 node left; ndoe right; ''' def build_Huffman_tree(nodes): """