您的位置:首页 > 其它

哈夫曼树及解码

2015-11-22 16:38 218 查看
添加上解码。

解码要求:

  根据输入的01字符串输出相对应的字符。

解码过程:

(1)node *p,p作为移动指针,在已经构造好的哈夫曼树中进行移动。移动规则,遇到0向左子树移动,遇到1向右子树移动。

(2)输入01字符串s(可以用string也可以用char数组,在此使用string),求出串的长度s.size().

(3)进入循环,进行相应判断以及输出。关键代码:

for(int i=0;i<lens;i++)
{
if(s[i]=='0')
{
if(p->lchild!=NULL)
{
p=p->lchild;
}
}
else if(s[i]=='1')
{
if(p->rchild!=NULL)
{
p=p->rchild;
}
}
if(p->lchild==NULL&&p->rchild==NULL)
{
printf("%c",p->ch);
p=tree;
}


给出全部代码以及运行实例:

 #include <bits/stdc++.h>
#define max_size 10010
char c[max_size];
double f[max_size];

using namespace std;
typedef struct node
{
char ch;
double freq;
node *lchild;
node *rchild;
node(char c=0,double f=0,node *l=NULL,node *r=NULL):
ch(c),freq(f),lchild(l),rchild(r) {}
};
typedef struct cmp
{
bool operator()(node*&a,node*&b)
{
return a->freq>b->freq;
}
};
node* createTree(int n)
{
priority_queue<node*,vector<node*>,cmp>que;
for(int i=1; i<=n; i++)
{
cin>>c[i]>>f[i];
que.push(new node(c[i],f[i]));
}
while(que.size()>1)
{
node *l=que.top();
que.pop();
node *r=que.top();
que.pop();
node *newnode=new node(0,l->freq+r->freq,l,r);
que.push(newnode);
}
return que.top();
}

void decode(string s,node *tree)
{
node *p=tree;
cin>>s;
getchar();
int lens=s.size();
for(int i=0;i<lens;i++) { if(s[i]=='0') { if(p->lchild!=NULL) { p=p->lchild; } } else if(s[i]=='1') { if(p->rchild!=NULL) { p=p->rchild; } } if(p->lchild==NULL&&p->rchild==NULL) { printf("%c",p->ch); p=tree; }
}
printf("\n");
}

void printInfo(const node *tree,string code)
{
if(tree->lchild==NULL&&tree->rchild==NULL)
{
cout<<tree->ch<<":"<<code<<" ";
return;
}
if(tree->lchild!=NULL)printInfo(tree->lchild,code+'0');
if(tree->rchild!=NULL)printInfo(tree->rchild,code+'1');
}

void deleteTree(node *tree)
{
if(tree->lchild!=NULL)deleteTree(tree->lchild);
if(tree->rchild!=NULL)deleteTree(tree->rchild);
delete(tree);
}

int main()
{
int n;
string s;
priority_queue<node*,vector<node*>,greater<node*> >que;
while(~scanf("%d",&n))
{
node *tree=createTree(n);
printf("Huffman code:\n");
printInfo(tree,"");
printf("\n");
decode(s,tree);
deleteTree(tree);
}
}


View Code



输入:

首先输入要构造的哈夫曼树有多少的元素。

然后输入每个元素以及其出现的频率(上面全部设为1)

然后输入01串,对其按照上面哈夫曼树的规则进行解码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: