您的位置:首页 > 其它

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

2017-11-01 13:17 351 查看
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
;//存放当前节点的哈夫曼吗
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;
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: