构造哈夫曼树

2021-11-30  本文已影响0人  喜忧参半

构造huffman树的算法:

算法思想:
哈夫曼算法采用自底向上逐步合并的方法,构造哈夫曼树:
步骤1)构造n颗单叶结点的二叉树,形成初始森林。
步骤2)执行三个操作,反复将森林中的两棵树合并成一棵树,直到森林中只有一棵树。


//构造哈夫曼树的函数,默认已有序
Hfptr createHftree(Hfptr head)
{
    int i;
    Hfptr p,q,r,t1,t2;         //p,q是后面给合并树排序用的
                               //t1和t2是待合并的两个权值最小二叉树
    for(i=1;i<n;i++)
    {
        r =new Hfnode; //r=malloc(sizeof(Hfnode));
        t1=head->next;  //权值最小的就是第一棵树
        t2=t1->next;    //权值最小的第二棵树
        r->data=t1->data + t2->data; //r的权值为t1和t2的和
        r->Lson=t1;     //t1作为左儿子
        r->Rson=t2;     //t2作为右儿子
        head->next=t2->next; //从森林中删去t1和t2
        q=head;         //准备进行有序插入
        p=head->next;   //p是搜索指针,q是p的前驱
        while(1)            //定位合并树的有序位置
            if(p->data<r->data)  //如果合并树权值比p所指树权值大
            {
                q=p;             //将当前所指位置赋给q
                p=p->next;       //并且p指针后移
            }else{          //否则?也就是找到了比合并树权值大的结点
                r->next=p;      //将那个结点作为p的后继结点
                q->next=r;      //将刚刚q作为p的前驱结点
                break;
            }
    }                        //终止for循环
    p=head->next;        //将头结点作为监督元;
    delete head;            //删去监督元
    return (p);                //返回huffman树的根
}                    //构造完毕
上一篇下一篇

猜你喜欢

热点阅读