哈夫曼树以及哈夫曼编码 .

来源:互联网 发布:外国人评论中国淘宝 编辑:程序博客网 时间:2024/05/16 18:35
#include <iostream>#include <string.h>using namespace std;#define N 1000struct HufmTree//哈夫曼树{  char ch;//结点字符  int weight;//结点的权值  int parent,lchild,rchild;};struct HuffmanCode{    char ch;    char bits[N+1];};HufmTree tree[N];//哈夫曼树HuffmanCode h[N];//哈夫曼编码void select(HufmTree tree[],int n,int&min1,int &min2)//选出parent 的值为0且权值最小的两个结点{    int mw1=100000,mw2=100000;    for(int i=1;i<=n;i++)    {       if(tree[i].parent!=0)continue;        if(tree[i].weight<=mw1)       {           mw2=mw1;           mw1=tree[i].weight;           min2=min1;           min1=i;       }       else if(tree[i].weight<mw2)       {           mw2=tree[i].weight;           min2=i;        }    } }void CreatHuffman(HufmTree *tree,int n)//n为结点个数{   if(n<=1)return;    int m=2*n;   for(int i =1;i<m;i++)//初始化结点    {       tree[i].parent=0;       tree[i].lchild=0;       tree[i].rchild=0;       tree[i].weight=0;    }   for(int i=1;i<=n;i++)//读入结点    {       cin>>tree[i].ch;       cin>>tree[i].weight;    }   for(int i=n+1;i<m;i++)    {       int min1,min2;//min1,min2,保存权值最小的两个结点的下标        select(tree,i-1,min1,min2);       tree[min1].parent=i;tree[min2].parent=i;       tree[i].lchild=min1;tree[i].rchild=min2;       tree[i].weight= tree[min1].weight + tree[min2].weight ;    }}void HuffmanCoding(HufmTree *tree,HuffmanCode*h,int n)//n为结点个数{    int c,p;    int start;    char cd[n+1];    cd[n]='\0';    for(int i=1;i<=n;i++)    {       h[i].ch=tree[i].ch;       start = n;       c=i;       p=tree[c].parent;       while(p==tree[c].parent)       {           if(tree[p].lchild==c)// 如果tree[c]是tree[p]的左孩子,则生成代码‘0’                cd[--start]='0';            else                cd[--start]='1';           c=p;           if(p==2*n-1)break;           else p=tree[p].parent;       }       for(int j=start;j<=n;j++)       {           h[i].bits[j-start]=cd[j];       }    }}

原创粉丝点击