#include <iostream>
#include <queue>
#include <unordered_map>
#include <vector>
using namespace std;
// A Huffman tree node
struct HuffmanNode {
char character;
int frequency;
HuffmanNode *left, *right;
HuffmanNode(char c, int f) : character(c), frequency(f),
left(nullptr), right(nullptr) {}
};
// Compare two Huffman nodes based on their frequency
struct CompareHuffmanNodes {
bool operator()(HuffmanNode* a, HuffmanNode* b) {
return a->frequency > b->frequency;
}
};
// Traverse the Huffman tree and generate Huffman codes
void generateHuffmanCodes(HuffmanNode* root, string code,
unordered_map<char, string>& huffmanCodes) {
if (root == nullptr) {
return;
}
if (root->character != '\0') {
huffmanCodes[root->character] = code;
}
generateHuffmanCodes(root->left, code + "0", huffmanCodes);
generateHuffmanCodes(root->right, code + "1", huffmanCodes);
}
// Build Huffman tree for given string
HuffmanNode* buildHuffmanTree(string input) {
// Calculate frequency of each character
unordered_map<char, int> charFreq;
for (char c : input) {
charFreq[c]++;
}
// Create min heap of Huffman nodes
priority_queue<HuffmanNode*, vector<HuffmanNode*>,
CompareHuffmanNodes> minHeap;
for (auto& p : charFreq) {
minHeap.push(new HuffmanNode(p.first, p.second));
}
// Build Huffman tree from min heap
while (minHeap.size() > 1) {
HuffmanNode *left = minHeap.top(); minHeap.pop();
HuffmanNode *right = minHeap.top(); minHeap.pop();
HuffmanNode *parent = new HuffmanNode('\0', left->frequency +
right->frequency);
parent->left = left;
parent->right = right;
minHeap.push(parent);
}
return minHeap.top();
}
// Driver code
int main() {
string input = "ACCEBFFFFAAXXBLKE";
HuffmanNode* root = buildHuffmanTree(input);
unordered_map<char, string> huffmanCodes;
generateHuffmanCodes(root, "", huffmanCodes);
for (auto& p : huffmanCodes) {
cout << p.first << ": " << p.second << endl;
}
return 0;
}