第十周项目实践 哈夫曼树的建立&&哈夫曼编码

来源:互联网 发布:淘宝二手镜头可以用吗 编辑:程序博客网 时间:2024/06/07 00:49
typedef struct{    char date;    int lchild,rchild;    int parent;}HTnode;void CreateHTnode(HTnode ht[],int n){    int min1,min2,lnode,rnode;    for(int i=0;i<2*n-1;++i)//所有节点的相关值置为-1    {        ht[i].prent=ht[i].lchild=ht[i].rchild-1;    }    for(int i=n;i<2*n-1;++i)//构造哈夫曼树    {        min1=min2=inf;        lnode=rnode=-1;//代表2个最小权重的节点位置        for(int j=0;j<i;++j)//在【0,i)中寻找最小权重的节点        {            if(ht[j].praent=-1)//在先前尚未找过的节点中进行查找            {                if(ht[j].date<min1)//判断是否是左节点                {                    min2=min1,rnode=lnode;                    min1=ht[j].date,lnode=j;                }                else if(ht[j].date<min2)//判断是否是右节点。基于思想,不能写成else 也不能写成if                {                    min2=ht[j].date,rnode=j;                }            }        }        //双亲节点的处理:        ht[i].date=ht[lnode].date+ht[rnode].date;        ht[i].lchild=lnode,ht[i].rchild=rnode;        ht[lnode].parent=ht[rnode].parent=i;    }}数据结构李春葆第五版P239哈夫曼编码:
typedef struct{    char cd[N];//存放当前节点的哈夫曼吗    int start;//表示cd[start...n0]部分是哈夫曼码    //因为哈夫曼树中每个叶子节点的哈夫曼编码长度不同,为此采用HCode类型的变量的cd[start..n0]存放当前结点的哈夫曼码}HCode;void createHCode(HTNode ht[],Hcode hcd[],int n0){    Hcode hc;    int c,f;    for(int i=0;i<n0;++i)//根据哈夫曼树求哈夫曼码    {        hc.start=n0,c=i;        f=ht[i].parent;        while(f!=-1)//直到循环到无双亲节点,即到达根节点        {            if(ht[f].lchild==c)//当前节点是双亲节点的左孩子                hc.cd[hc.start--]='0';            else                hc.cd[hc.start--]='1';//右孩子            c=f,f=ht[f].parent;//反复进行同样的操作        }        hc.start++;//start指向哈夫曼树编码的最开始的字符        hcd[i]=hc;    }}
 
阅读全文
0 0
原创粉丝点击