哈夫曼编码与解码
#include<iostream>
#include<queue>
#include<string>
using namespace std;
class Node {
public:
char c;
int frequency;
Node* left;
Node* right;
Node() {};
Node(char c1,int f,Node* l=NULL,Node* r=NULL ):c(c1),frequency(f),left(l),right(r){}
bool operator<(const Node& node)const {
return frequency > node.frequency;
}
void code(priority_queue<Node>& q);
void decode(priority_queue<Node>& q1,string s);
};
void Node::code(priority_queue<Node>& q)
{
while (q.size() != 1) {
Node *left = new Node(q.top());
q.pop();
Node *right = new Node(q.top());
q.pop();
Node node('R', left->frequency + right->frequency, left, right);
q.push(node);
}
}
void Node::decode(priority_queue<Node>& q1,string s)
{
Node n = q1.top();
Node* n1 = &n;
Node* n2 = &n;
if (n.left == NULL && n.right == NULL)
cout << "树中只有一个元素:" << n.c << endl;
else {
for (int i = 0; i < s.size(); i++) {
if (s[i] != '0'&&s[i] != '1') {
cout << "输入错误" << endl;
break;
}
while (1) {
if (s[i] == '0') {
n1 = n1->left;
if (n1->c == 'R') {
break;
}
if (n1->c != 'R') {
cout << n1->c;
n1 = n2;
break;
}
}
else if (s[i] == '1'){
n1 = n1->right;
if (n1->c == 'R') {
break;
}
if (n1->c != 'R') {
cout << n1->c;
n1 = n2;
break;
}
}
}
}
}
}
int main()
{
Node x, y;
Node a('A', 20);
Node b('B', 10);
Node c('C', 10);
Node d('D', 15);
Node e('E', 45);
priority_queue<Node> q,q1;
q.push(a);
q.push(b);
q.push(c);
q.push(d);
q.push(e);
q1.push(a);
y.code(q1);
string s1="0";
y.decode(q1, s1);
x.code(q);
while (1) {
string s0;
cout << endl << "请输入一串编码" << endl;
cin >> s0;
x.decode(q, s0);
}
}