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;

       }

       }

    }

  • 相关阅读:
    Windows 7 任务计划程序
    '7z' 不是内部或外部命令,也不是可运行的程序
    [转]国外人气最旺的软件测试网站
    AutoIT查找文件内容并修改保存
    BUG 太少
    excel表格数据导入sqlserver数据库
    RoR常见问题
    [转]漫画:程序员的一生
    [转]RubyInstaller: Getting Started with Rails and SQLite3
    [转]C#多线程学习(一) 多线程的相关概念
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457668.html
Copyright © 2011-2022 走看看