0001 HuffTree* minHChar ( 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->root()->data.weight > p->data->root()->data.weight ) //不断更新 0005 m = p; //找到最小节点(所对应的Huffman子树) 0006 return forest->remove( m ); //从森林中取出该子树,并返回 0007 } 0008 0009 HuffTree* generateTree ( HuffForest* forest ) { //Huffman编码算法 0010 while ( 1 < forest->size() ) { 0011 HuffTree* T1 = minHChar ( forest ); HuffTree* T2 = minHChar ( forest ); 0012 HuffTree* S = new HuffTree(); 0013 S->insert ( HuffChar ( '^', T1->root()->data.weight + T2->root()->data.weight ) ); 0014 S->attach ( T1, S->root() ); S->attach ( S->root(), T2 ); 0015 forest->insertAsLast ( S ); 0016 } //assert: 循环结束时,森林中唯一(列表首节点中)的那棵树即Huffman编码树 0017 return forest->first()->data; 0018 }