哈夫曼树及解码
2015-11-22 16:38
218 查看
添加上解码。
解码要求:
根据输入的01字符串输出相对应的字符。
解码过程:
(1)node *p,p作为移动指针,在已经构造好的哈夫曼树中进行移动。移动规则,遇到0向左子树移动,遇到1向右子树移动。
(2)输入01字符串s(可以用string也可以用char数组,在此使用string),求出串的长度s.size().
(3)进入循环,进行相应判断以及输出。关键代码:
给出全部代码以及运行实例:
View Code
输入:
首先输入要构造的哈夫曼树有多少的元素。
然后输入每个元素以及其出现的频率(上面全部设为1)
然后输入01串,对其按照上面哈夫曼树的规则进行解码。
解码要求:
根据输入的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串,对其按照上面哈夫曼树的规则进行解码。
相关文章推荐
- php中一些函数的用法
- 页面之间的普通传值和反向传值
- Extjs5 常用layout
- 【poj2575】Jolly Jumpers
- Maximum Depth of Binary Tree (Leet Code)
- webview返回按钮 iOS
- 在ubuntu下安装python imagine library
- 网页元素位置、鼠标事件位置信息小结
- 如何使用富文本编辑器xheditor
- HDU1029-Ignatius and the Princess IV
- Android应用内语言切换实现
- 自定义控件SettingItemView
- zzulioj 1783: 简单的求和 (筛选求和) 求和预处理 好题
- SQLite使用事务更新—by command
- 《你的灯亮着吗?:发现问题的真正所在》读书笔记
- HTML表格边框的设置小技巧
- CALayer 为什么选择 cg 开头 而 不选择 UI 开头
- jsp页面、servlet显示中文乱码详解
- ETL浅谈
- Assets目录下的文件大小是否有限制?