HuffForest* initForest(int* freq) { //根据频率统计表,为每个字符创建一棵树
   HuffForest* forest = new HuffForest; //以List实现的Huffman森林
   for (int i = 0; i < N_CHAR; i++) { //为每个字符
      forest->insertAsLast(new HuffTree); //生成一棵树,并将字符及其频率
      forest->last()->data->insertAsRoot(HuffChar(0x20+i, freq[i])); //存入其中
   }
   return forest;
}
HuffTree* generateTree ( HuffForest* forest ) { //Huffman编码算法
   while ( 1 < forest->size() ) {
      HuffTree* T1 = minHChar ( forest ); HuffTree* T2 = minHChar ( forest );
      HuffTree* S = new HuffTree(); /*DSA*/printf ( "\n################\nMerging " ); print ( T1->root()->data ); printf ( " with " ); print ( T2->root()->data ); printf ( " ...\n" );
      S->insertAsRoot ( HuffChar ( '^', T1->root()->data.weight + T2->root()->data.weight ) );
      S->attachAsLC ( S->root(), T1 ); S->attachAsRC ( S->root(), T2 );
      forest->insertAsLast ( S ); /*DSA*/ //print(forest);
   } //assert: 循环结束时,森林中唯一(列表首节点中)的那棵树即Huffman编码树
   return forest->first()->data;
}
/******************************************************************************************
 * Huffman树构造算法:对传入的Huffman森林forest逐步合并,直到成为一棵树
 ******************************************************************************************
 * forest基于优先级队列实现,此算法适用于符合PQ接口的任何实现方式
 * 为Huffman_PQ_List、Huffman_PQ_ComplHeap和Huffman_PQ_LeftHeap共用
 * 编译前对应工程只需设置相应标志:DSA_PQ_List、DSA_PQ_ComplHeap或DSA_PQ_LeftHeap
 ******************************************************************************************/
HuffTree* generateTree(HuffForest* forest) {
   while (1 < forest->size()) {
      HuffTree* s1 = forest->delMax(); HuffTree* s2 = forest->delMax();
      HuffTree* s = new HuffTree();
      /*DSA*/printf("Merging "); print(s1->root()->data); printf(" with "); print(s2->root()->data); printf(" ...\n");
      s->insertAsRoot(HuffChar('^', s1->root()->data.weight + s2->root()->data.weight));
      s->attachAsLC(s->root(), s1); s->attachAsRC(s->root(), s2);
      forest->insert(s); //将合并后的Huffman树插回Huffman森林
   }
   HuffTree* tree = forest->delMax(); //至此,森林中的最后一棵树
   return tree; //即全局Huffman编码树
}