哈夫曼树

来源:互联网 发布:淘宝兰芝官方旗舰店 编辑:程序博客网 时间:2024/06/08 01:04

哈夫曼的构造算法:每次把权值最小的两颗二叉树合并

typedef strcut TreeNode *HuffmanTree;struct TreeNode {    int Weight;    HuffmanTree Left, Right;}HuffmanTree Huffman( MinHeap H ){    int i;    HuffmanTree T;    BuildMinHeap( H );//将H->Elements[]按权值调整为最小堆    for ( i = 1; i < H->Size; i++ ){        T = malloc( sizeof(struct TreeNode ) );        T->Left = DeleteMin( H );            //从最小堆中删除一个结点,作为新T的左子结点        T->Right = DeleteMin( H );            //从最小堆中删除一个结点,作为新T的右子结点        T->Wight = T->Left->Weight + T->Right->Weight;            //计算新权值        Insert( H, T );//将新T插入最小堆    }    T = DeleteMin( H );    retrun T;}

这里的算法,在如何挑选两个最小元素时,用到了昨天所写的堆(最优队列)。每一次循环时,都从最小堆中挑选两个元素出来,既T->Left = DeleteMin( H ), T->Right = DeleteMin( H )。然后将其权值合并
T->Wight = T->Left->Weight + T->Right->Weight,接着插入到堆中去。

如果要从零开始构建哈夫曼树,流程应该是:

  1. 按照元素的频率高低,建立一个最小堆:BuildMinHeap( H )
  2. 建完堆之后,按照哈夫曼树的构造方法,从最小堆中选出两个最小的元素。
  3. Insert( H, T).
0 0