import java.util.*;
class HuffmanNode implements Comparable<HuffmanNode> {
char ch;
int freq;
HuffmanNode left, right;
HuffmanNode(char ch, int freq) {
this.ch = ch;
this.freq = freq;
}
public int compareTo(HuffmanNode other) {
return this.freq - other.freq;
}
}
public class HuffmanEncoding {
public static Map<Character, String> buildHuffmanTree(Map<Character, Integer> freqMap) {
PriorityQueue<HuffmanNode> pq = new PriorityQueue<>();
// Create leaf nodes for each character
for (var entry : freqMap.entrySet()) {
pq.add(new HuffmanNode(entry.getKey(), entry.getValue()));
}
// Build the tree
while (pq.size() > 1) {
HuffmanNode left = pq.poll(); // smallest freq
HuffmanNode right = pq.poll(); // next smallest freq
HuffmanNode merged = new HuffmanNode('\0', left.freq + right.freq);
merged.left = left;
merged.right = right;
pq.add(merged);
}
HuffmanNode root = pq.poll();
Map<Character, String> codes = new HashMap<>();
buildCodes(root, "", codes);
return codes;
}
private static void buildCodes(HuffmanNode node, String code, Map<Character, String> codes) {
if (node == null) return;
if (node.left == null && node.right == null) {
codes.put(node.ch, code);
return;
}
buildCodes(node.left, code + "0", codes); // left edge adds '0'
buildCodes(node.right, code + "1", codes); // right edge adds '1'
}
public static void main(String[] args) {
String text = "ABBCCCDDDDEEEEEFFFFFFF";
Map<Character, Integer> freqMap = new HashMap<>();
// Count frequencies
for (char ch : text.toCharArray()) {
freqMap.put(ch, freqMap.getOrDefault(ch, 0) + 1);
}
Map<Character, String> codes = buildHuffmanTree(freqMap);
// Print codes
for (char ch : freqMap.keySet()) {
System.out.println(ch + ":" + codes.get(ch));
}
}
}for (var entry : freqMap.entrySet()) { pq.add(new HuffmanNode(entry.getKey(), entry.getValue())); }
Create leaf nodes for each character with frequency
while (pq.size() > 1) { HuffmanNode left = pq.poll(); HuffmanNode right = pq.poll(); HuffmanNode merged = new HuffmanNode('\0', left.freq + right.freq); merged.left = left; merged.right = right; pq.add(merged); }
Merge two smallest nodes repeatedly to build Huffman tree
buildCodes(root, "", codes);
Traverse tree to assign binary codes to characters
if (node.left == null && node.right == null) { codes.put(node.ch, code); return; }
Assign code to leaf node character
buildCodes(node.left, code + "0", codes);
Add '0' for left edge in code
buildCodes(node.right, code + "1", codes);
Add '1' for right edge in code
A:1010
B:1011
C:100
D:00
E:01
F:11