zoukankan      html  css  js  c++  java
  • HuffmanTree

    /* 

       

      例如,对于数列{pi}={5, 3, 8, 2, 9}Huffman树的构造过程如下:

      1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是23,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5

      2. 找到{5, 8, 9, 5}中最小的两个数,分别是55,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10

      3. 找到{8, 9, 10}中最小的两个数,分别是89,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17

      4. 找到{10, 17}中最小的两个数,分别是1017,从{pi}中删除它们并将和27加入,得到{27},费用为27

      5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59

    */

    #include <stdlib.h>

    #include <iostream>

    using namespace std;

    typedef struct node{

          struct node *left;

          struct node *right;

          int weight;

          char data;

    }Huff;

    class Huffm{

          private:

               Huff **F;

               int n;

               Huff *root;

        public:

             Huffm(int *pi,int n){

             Huff *p=NULL;

                F=(Huff **)malloc(sizeof(Huff *));

                       for(int i=0;i < n ;i++){

                    p=(Huff *)malloc(sizeof(Huff));

                    p->left=p->right=NULL;

                    p->weight=pi[i];

                    p->data='a'+i;

                    F[i]=p;

                }//for

                this->n=n;

             }

            void  BuiltHuff();//建树

            Huff *gettree();//返回头结点

            void Printree(Huff *tree);//层遍历输出整棵树

    };

    int main(void)

    {

          int pi[]={5,3,8,2,9};

          Huffm *tree=new Huffm(pi,5);

          tree->BuiltHuff();

          Huff *root=tree->gettree();

          tree->Printree(root);

          return 0;

    }

    void Huffm::BuiltHuff()

    {

          Huff *p=NULL;

          int k1,k2;

          for(int i=0;i<n-1;i++){

          //最小次小

               for(k1=0;!F[k1];k1++);

               for(k2=k1+1;!F[k2];k2++);

               for(int j=k2;j<n;j++){

                     if(F[j]){

                          if(F[j]->weight<F[k1]->weight){

                                k2=k1;

                                k1=j;

                          }else if(F[j]->weight<F[k2]->weight){

                                k2=j;

                          }

                     }/*if F[j] */

               }/*for j*/

               //建树

                p=(Huff *)malloc(sizeof(Huff));

                p->data=0;

                p->left=F[k1];

                p->right=F[k2];

                p->weight=F[k1]->weight+F[k2]->weight;

                F[k1]=p;

                F[k2]=NULL;

          }/*for i*/

          this->root=F[k1];

    }

    Huff *Huffm::gettree()//返回头结点

    {

          return root;

    }

    void Huffm::Printree(Huff *tree)//层遍历输出整棵树

    {

       Huff **p=(Huff **)malloc(sizeof(Huff *));

       Huff *pnode=NULL;

       int head=0,tail=0;

       p[++tail]=tree;

       while(tail!=head){

       head=(head+1)%5;

       cout<<p[head]->weight<<p[head]->data<<" ";

       pnode=p[head];

       if(pnode->left){

                 tail=(tail+1)%5;

                 p[tail]=pnode->left;

       }

       if(pnode->right){

                 tail=(tail+1)%5;

                 p[tail]=pnode->right;

       }

       }

    }

  • 相关阅读:
    通过写一个Demo展示C#中多种常用的集合排序方法
    【MM系列】SAP MM模块-打开前面物料账期的方法
    【FICO系列】SAP FICO模块-财务账期的打开和关闭
    【ABAP系列】SAP LSWM处理时,网络中断,出现错误
    【ABAP系列】SAP ABAP模块-ABAP动态指针写法的精髓部分
    【MM系列】SAP MM模块-MIGO收货后自动打印收货单
    【ABAP系列】SAP ABAP模块-任意report作为附件以邮件形式发送
    【ABAP系列】SAP ABAP模块-memory内存数据传输的例子
    【ABAP系列】SAP ABAP模块-查找系统出口或BADI的方法
    【MM系列】SAP MM模块-查看移动平均价的历史记录
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457668.html
Copyright © 2011-2022 走看看