forked from sundeshgupta/encoding-algorithm
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhuffman_decode.cpp
93 lines (70 loc) · 1.29 KB
/
huffman_decode.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <bits/stdc++.h>
using namespace std;
struct pixel{
int label;
pixel* left, *right;
pixel(int x): label(x){
left = NULL;
right = NULL;
}
};
pixel* add(pixel* root, int i, string s, string label){
if(root == NULL){
root = new pixel(-1);
}
if(i == s.length()){
cout << s << " " << label << endl;
root->label = stoi(label);
return root;
}
if(s[i] == '0'){
root->left = add(root->left, i+1, s, label);
}
else{
root->right = add(root->right, i+1, s, label);
}
return root;
}
void preoder(pixel* root, string s){
if(root == NULL)
return;
if(root->label != -1){
cout << setfill(' ') << setw(3) << root->label
<< " -> " << setw(7) << s << endl;
return;
}
preoder(root->left, s + '0');
preoder(root->right, s + '1');
return;
}
int main(){
int n;
cin>>n;
pixel* root = new pixel(-1);
for(int i=0; i<n; i++){
string a,b,c;
cin>>a>>b>>c;
add(root, 0, c, a);
}
// for checking
preoder(root, "");
string w;
cin >> w;
pixel* ptr = root;
vector<int> v;
for(auto i:w){
if(i=='0')
ptr = ptr->left;
else
ptr = ptr->right;
if(ptr->label != -1){
v.push_back(ptr->label);
ptr = root;
}
}
for(auto i:v){
cout << (char)i ;
} cout << endl;
return 0;
}
// blvbjeanvnkjvnjlearknjnakrnekndcjbhbllivuekrjhggefskvhfbvkjdbsrjgk