10-哈夫曼编码及综合
题目描述
已知赫夫曼编码算法和程序,在此基础上进行赫夫曼解码
在赫夫曼树的类定义中增加了一个公有方法:
int Decode(const string codestr, char txtstr[]);//输入编码串codestr,输出解码串txtstr
该方法如果解码成功则返回1,解码失败则返回-1,本程序增加宏定义ok表示1,error表示-1
解码方法的代码框架如下:
输入
第一行输入t,表示有t个测试实例
第二行先输入n,表示第1个实例有n个权值,接着输入n个权值,权值全是小于1万的正整数
第三行输入n个字母,表示与权值对应的字符
第四行输入k,表示要输入k个编码串
第五行起输入k个编码串
以此类推输入下一个示例
输出
每行输出解码后的字符串,如果解码失败直接输出字符串“error”,不要输出部分解码结果
输入样例
2
5 15 4 4 3 2
A B C D E
3
11111
10100001001
00000101100
4 7 5 2 4
A B C D
3
1010000
111011
111110111
AAAAA
ABEAD
error
BBAAA
error
DCD
#include<iostream>
#include<string>
#include<cstring>
#define ok 1
#define error -1
using namespace std;
const int maxw=9999;
class huffnode
{
public:
int weight,parent,lchild,rchild;
};
class huffman
{
private:
void maketree();
void selectmin(int pos,int *s1,int *s2);
public:
int len;
int lnum;
huffnode *hufftree;
string *huffcode;
void maketree(int n,int *wt);
void coding();
void destroy();
int decode(const string codestr,char *txtstr);//解码!
};
void huffman::maketree(int n,int *wt)
{
int i;
lnum=n;
len=2*n-1