版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39993896/article/details/84500637
Problem Description
由若干个值无重复的结点及其权值,建立相应的哈夫曼树。在合并过程中,若出现权值相同的情况,则优先选取编号小的进行合并;要求哈夫曼树中所有左孩子编号小于右孩子编号(以结点的输入顺序做为其编号)。对所建的哈夫曼树,根据左0右1的原则,对各结点进行编码。设计一个算法,对给定的若干码串进行相应的解码,并输出解码结果。
Input
有多组测试数据,每组数据由结点信息和码串两部分组成。结点信息部分的第一行为一个整数n(n<=20),表示以下有n个结点信息,每个结点信息包括一个字符和一个整数,表示结点值和权值;码串部分的第一行为一个整数m,表示以下有m个码串(每个串长不超过100),码串由0和1构成,且均有效。
Output
输出各码串对应的解码结果,每个解码结果占一行,每组测试数据后有一空行。
Sample Input
4 A7 G5 O2 D4 2 10110110111 11111010
Sample Output
GOOD DOG
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct node {
int parent;
int lchild,rchild;
int weight;
};
class Stack {
public :
int top;
char data[101];
public:
Stack() {
top=-1;
}
void Push(char ch) {
data[++top]=ch;
}
char* ToArray() {
char* temp=new char[top+1];
for(int i=0; i<strlen(temp); i++) {
temp[i]=data[top--];
}
for(int i=0; i<strlen(temp); i++) {
cout<<temp[i];
}
cout<<endl;
return temp;
}
};
node* array;
int select_min(int n) {
int minIndex;
for(int i=0; i<2*n-1; i++) {
if(array[i].parent==-1&&array[i].weight!=0) {
minIndex=i;
break;
}
}
for(int i=0; i<2*n-1; i++) {
if(array[i].parent==-1&&array[i].weight!=0) {
if(array[i].weight<array[minIndex].weight)
minIndex=i;
}
}
array[minIndex].parent=1;
return minIndex;
}
void CreatHuffman(int *w,int n) {
for(int i=0; i<2*n-1; i++) {
array[i].parent=-1;
array[i].lchild=-1;
array[i].rchild=-1;
array[i].weight=w[i];
}
for(int j=n; j<2*n-1; j++) {
int min_lchild=select_min(n);
int min_rchild=select_min(n);
array[j].lchild=min_lchild;
array[j].rchild=min_rchild;
array[j].weight=array[min_lchild].weight+array[min_rchild].weight;
array[min_lchild].parent=j;
array[min_rchild].parent=j;
}
}
Stack *s;
char** preFix;
int pre_len[101];
void PreFix(int n) {
s=new Stack[n];
for(int child=0; child<n; child++) {
int temp=child;
int flag;
for(int i=n; i<2*n-1; i++) {
flag=0;
if(array[i].lchild==temp) {
s[child].Push('0');
flag=1;
}
if(array[i].rchild==temp) {
s[child].Push('1');
flag=1;
}
if(flag) {
temp=i;
}
}
}
}
void toArray(Stack* s,int n) {
preFix=new char*[n];
for(int i=0; i<n; i++) {
int c=s[i].top;
pre_len[i]=c+1;
preFix[i]=new char[c+1];
for(int k=0; k<c+1; k++) {
preFix[i][k]=s[i].data[s[i].top--];
}
}
}
void Match(char* str,int n,char* character) {
int len=strlen(str);
int j=0;
int p=0;
for(int i=0; i<len; ) {
while(j<n) {
if(p==pre_len[j]) {
cout<<character[j];
p=0;
j=0;
} else if(preFix[j][p]==str[i]) {
{
p++;
i++;
}
} else if(i==len) {
break;
} else {
j++;
i-=p;
p=0;
}
}
}
}
int main() {
int n;
while(cin>>n) {
char* character=new char[n];
int *weight=new int[2*n-1];
array=new node[2*n-1];
for(int i=0; i<n; i++) {
cin>>character[i]>>weight[i];
}
for(int j=n; j<2*n-1; j++) {
weight[j]=0;
}
CreatHuffman(weight,n);
int m;
cin>>m;
char str[101];
for(int k=0; k<m; k++) {
cin>>str;
PreFix(n);
toArray(s,n);
Match(str,n,character);
cout<<endl;
}
cout<<endl;
}
return 0;
}