Skip to content

Commit d3288ba

Browse files
authored
Huffman coding in C++
1 parent cce0548 commit d3288ba

File tree

1 file changed

+269
-0
lines changed

1 file changed

+269
-0
lines changed

C++/huffman_coding.cpp

+269
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
1+
#include <iostream>
2+
#include <cstdlib>
3+
using namespace std;
4+
5+
6+
#define MAX_TREE_HT 100
7+
8+
9+
struct MinHeapNode {
10+
11+
12+
char data;
13+
14+
15+
unsigned freq;
16+
17+
18+
struct MinHeapNode *left, *right;
19+
};
20+
21+
22+
struct MinHeap {
23+
24+
25+
unsigned size;
26+
27+
28+
unsigned capacity;
29+
30+
31+
struct MinHeapNode** array;
32+
};
33+
34+
35+
struct MinHeapNode* newNode(char data, unsigned freq)
36+
{
37+
struct MinHeapNode* temp
38+
= (struct MinHeapNode*)malloc
39+
(sizeof(struct MinHeapNode));
40+
41+
temp->left = temp->right = NULL;
42+
temp->data = data;
43+
temp->freq = freq;
44+
45+
return temp;
46+
}
47+
48+
49+
struct MinHeap* createMinHeap(unsigned capacity)
50+
51+
{
52+
53+
struct MinHeap* minHeap
54+
= (struct MinHeap*)malloc(sizeof(struct MinHeap));
55+
56+
57+
minHeap->size = 0;
58+
59+
minHeap->capacity = capacity;
60+
61+
minHeap->array
62+
= (struct MinHeapNode**)malloc(minHeap->
63+
capacity * sizeof(struct MinHeapNode*));
64+
return minHeap;
65+
}
66+
67+
68+
void swapMinHeapNode(struct MinHeapNode** a,
69+
struct MinHeapNode** b)
70+
71+
{
72+
73+
struct MinHeapNode* t = *a;
74+
*a = *b;
75+
*b = t;
76+
}
77+
78+
79+
void minHeapify(struct MinHeap* minHeap, int idx)
80+
81+
{
82+
83+
int smallest = idx;
84+
int left = 2 * idx + 1;
85+
int right = 2 * idx + 2;
86+
87+
if (left < minHeap->size && minHeap->array[left]->
88+
freq < minHeap->array[smallest]->freq)
89+
smallest = left;
90+
91+
if (right < minHeap->size && minHeap->array[right]->
92+
freq < minHeap->array[smallest]->freq)
93+
smallest = right;
94+
95+
if (smallest != idx) {
96+
swapMinHeapNode(&minHeap->array[smallest],
97+
&minHeap->array[idx]);
98+
minHeapify(minHeap, smallest);
99+
}
100+
}
101+
102+
103+
int isSizeOne(struct MinHeap* minHeap)
104+
{
105+
106+
return (minHeap->size == 1);
107+
}
108+
109+
110+
struct MinHeapNode* extractMin(struct MinHeap* minHeap)
111+
112+
{
113+
114+
struct MinHeapNode* temp = minHeap->array[0];
115+
minHeap->array[0]
116+
= minHeap->array[minHeap->size - 1];
117+
118+
--minHeap->size;
119+
minHeapify(minHeap, 0);
120+
121+
return temp;
122+
}
123+
124+
125+
void insertMinHeap(struct MinHeap* minHeap,
126+
struct MinHeapNode* minHeapNode)
127+
128+
{
129+
130+
++minHeap->size;
131+
int i = minHeap->size - 1;
132+
133+
while (i && minHeapNode->freq < minHeap->array[(i - 1) / 2]->freq) {
134+
135+
minHeap->array[i] = minHeap->array[(i - 1) / 2];
136+
i = (i - 1) / 2;
137+
}
138+
139+
minHeap->array[i] = minHeapNode;
140+
}
141+
142+
143+
void buildMinHeap(struct MinHeap* minHeap)
144+
145+
{
146+
147+
int n = minHeap->size - 1;
148+
int i;
149+
150+
for (i = (n - 1) / 2; i >= 0; --i)
151+
minHeapify(minHeap, i);
152+
}
153+
154+
155+
void printArr(int arr[], int n)
156+
{
157+
int i;
158+
for (i = 0; i < n; ++i)
159+
cout<< arr[i];
160+
161+
cout<<"\n";
162+
}
163+
164+
165+
int isLeaf(struct MinHeapNode* root)
166+
167+
{
168+
169+
return !(root->left) && !(root->right);
170+
}
171+
172+
173+
struct MinHeap* createAndBuildMinHeap(char data[], int freq[], int size)
174+
175+
{
176+
177+
struct MinHeap* minHeap = createMinHeap(size);
178+
179+
for (int i = 0; i < size; ++i)
180+
minHeap->array[i] = newNode(data[i], freq[i]);
181+
182+
minHeap->size = size;
183+
buildMinHeap(minHeap);
184+
185+
return minHeap;
186+
}
187+
188+
struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size)
189+
190+
{
191+
struct MinHeapNode *left, *right, *top;
192+
193+
194+
struct MinHeap* minHeap = createAndBuildMinHeap(data, freq, size);
195+
196+
197+
while (!isSizeOne(minHeap)) {
198+
199+
200+
left = extractMin(minHeap);
201+
right = extractMin(minHeap);
202+
203+
204+
top = newNode('$', left->freq + right->freq);
205+
206+
top->left = left;
207+
top->right = right;
208+
209+
insertMinHeap(minHeap, top);
210+
}
211+
212+
213+
return extractMin(minHeap);
214+
}
215+
216+
217+
void printCodes(struct MinHeapNode* root, int arr[], int top)
218+
219+
{
220+
221+
222+
if (root->left) {
223+
224+
arr[top] = 0;
225+
printCodes(root->left, arr, top + 1);
226+
}
227+
228+
229+
if (root->right) {
230+
231+
arr[top] = 1;
232+
printCodes(root->right, arr, top + 1);
233+
}
234+
235+
236+
if (isLeaf(root)) {
237+
238+
cout<< root->data <<": ";
239+
printArr(arr, top);
240+
}
241+
}
242+
243+
244+
void HuffmanCodes(char data[], int freq[], int size)
245+
246+
{
247+
248+
struct MinHeapNode* root
249+
= buildHuffmanTree(data, freq, size);
250+
251+
252+
int arr[MAX_TREE_HT], top = 0;
253+
254+
printCodes(root, arr, top);
255+
}
256+
257+
258+
int main()
259+
{
260+
261+
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
262+
int freq[] = { 5, 9, 12, 13, 16, 45 };
263+
264+
int size = sizeof(arr) / sizeof(arr[0]);
265+
266+
HuffmanCodes(arr, freq, size);
267+
268+
return 0;
269+
}

0 commit comments

Comments
 (0)