1
+ // A Huffman tree node
2
+ struct MinHeapNode {
3
+ char data; // One of the input characters
4
+ unsigned freq; // Frequency of the character
5
+ MinHeapNode *left, *right; // Left and right child
6
+ MinHeapNode (char data, unsigned freq): data(data), freq(freq), left(nullptr ), right(nullptr ) {
7
+ }
8
+ };
9
+
10
+ struct compare {
11
+ bool operator ()(MinHeapNode* lhs, MinHeapNode* rhs) {
12
+ return (lhs->freq > rhs->freq );
13
+ }
14
+ };
15
+
16
+ void printCodes (struct MinHeapNode * root, string str) {
17
+ if (!root) return ;
18
+ if (root->data != ' $' ) {
19
+ cout << root->data << " : " << str << " \n " ;
20
+ }
21
+ printCodes (root->left , str + " 0" );
22
+ printCodes (root->right , str + " 1" );
23
+ }
24
+
25
+ void huffmanCodes (unordered_map<char , int >& freqMap) {
26
+ priority_queue<MinHeapNode*, vector<MinHeapNode*>, compare> minHeap;
27
+ for (auto iter = freqMap.begin (); iter != freqMap.end (); ++iter) {
28
+ minHeap.push (new MinHeapNode (iter->first , iter->second ));
29
+ }
30
+ while (minHeap.size () != 1 ) {
31
+ MinHeapNode* left = minHeap.top ();
32
+ minHeap.pop ();
33
+ MinHeapNode* right = minHeap.top ();
34
+ minHeap.pop ();
35
+ MinHeapNode* newNode = new MinHeapNode (' #' , left->freq + right->freq );
36
+ newNode->left = left;
37
+ newNode->right = right;
38
+ minHeap.push (newNode);
39
+ }
40
+
41
+ printCodes (minHeap.top (), " " );
42
+ }
0 commit comments