哈夫曼树算法实现

哈夫曼树(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;
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值