0001 HuffTree delMax( HuffForest* forest ) { //从Huffman森林中,找出优先级最高(权重最小)的树 0002 ListNodePosi<HuffTree> m = forest->first(); //从首节点出发 0003 for ( ListNodePosi<HuffTree> p = m->succ; forest->valid( p ); p = p->succ ) //遍历所有节点 0004 if ( m->data < p->data ) //不断更新(因已定义比较器,故能简捷) 0005 m = p; //优先级更高(权重更小)者 0006 return forest->remove( m ); //取出最高者并返回 0007 } //O(n),改用优先级队列后可做到O(logn) 0008 0009 HuffTree generateTree( HuffForest* forest ) { //由Huffman森林,构造出Huffman编码树 0010 while ( 1 < forest->size() ) { //每迭代一步,森林中都会减少一棵树 0011 HuffTree T1 = delMax( forest ), T2 = delMax( forest ); //取出权重最小的两棵树 0012 HuffTree S; //将其合并成一棵新树 0013 S.insert( HuffChar ( '^', T1.root()->data.weight + T2.root()->data.weight ) ); 0014 S.attach( T2, S.root() ); S.attach( S.root(), T1 ); //T2权重不小于T1 0015 forest->insertLast( S ); //再插回至森林 0016 } //森林中最终唯一所剩的那棵树,即Huffman编码树(且其层次遍历序列必然单调非增) 0017 return forest->first()->data; //故返回之 0018 }