哈夫曼树算法实现

来源:互联网 发布:it职业技术学校 编辑:程序博客网 时间:2024/05/20 12:46

哈夫曼树(Huffman Tree),即最优二叉树(optimium binary tree),是一类带权路径长度最短的二叉树。

1、哈夫曼树的构造方法

1)根据n个权值w1,w2,w3......wn构造n棵二叉树的森林F={T1,T2,T3......Tn}Ti含带权为wi的根节点,无左右子树;

2)在森林F中选择两可根节点权值最小的二叉树作为左右子树,合并为新的二叉树,并删除这两棵二叉树;

3)重复2)步,直到只剩一颗二叉树,即为哈夫曼树

2、哈夫曼树的应用

1)改善判定树。利用哈夫曼树得到最优判定算法。

2)哈夫曼编码

3、哈夫曼树编码算法

类声明:

const int N=30;//叶节点的最大数const int M=2*N-1;//总结点的最大数const int MAX=9999;//最大常量const int L=20;//编码最大长度struct element{      int weight;      int lchild,rchild,parent;};//结构类型说明typedef struct{      char bits[N];//用于存放位串      int start;//用于存放编码在位串中的起始位置      char ch;//编码存储的结构类型说明}codetype;

1)建立哈夫曼树的算法

void HuffmanTree(elemrnt hT[],int w[],int n)
{
      int i,k,,i1,i2;
      for(i=0;i<2*n-1;i++)  hT[i].parent=hT[i].lchild=hT[i].rchild=-1;
      for(i=0;i<n;i++)  hT[i].weight=w[i];
      for(k=n;k<2*n-1;k++){
            Select(hT,i1,i2,k);
            hT[i1].parent=hT[i2].parent=k;
            hT[k].weight=hT[i1].weight+hT[i2].weight;
            hT[k].lchild=i1;
            hT[k].rchild=i2;
      }
}

选取最小两棵二叉树的函数Select():

void Select(element hT[],int &i1,int &i2,int k){    int min1=MAX,min2=MAX;//MAX为较大常数,如9999    i1=0;i2=0;//分别记录最小和次小所在的下标值    for(int i=0;i<k;i++)//找出min1<=min2 两个最小        if(hT[i].parent==-1)//一定在双亲为空的结点中找              if(hT[i].weight<min1){                  min2=min1;i2=i1;min1=hT[i].weight;i1=i;              }else if(hT[i].weight<min2){                  min2=hT[i].weight;i2=i;              }}

2)建立哈夫曼编码的算法:

void HuffmanCode(element hT[],codetype code[],int n){    int i,c,;codetype cd;    for(i=0;i<n;i++){        cd.start=n;c=i;p=hT[[c].parent;//i的双亲p        while(p!=-1){            cd.start--;            if(hT[p].lchild==c)                cd.bits[cd.start]='0';            else                cd.bits[cd.start]='1';            c=p;            p=hT[c].parent;        }        code[i]=cd;    }}


0 0