diff --git a/src/main/java/com/thealgorithms/greedyalgorithms/Huffman.java b/src/main/java/com/thealgorithms/greedyalgorithms/Huffman.java new file mode 100644 index 000000000000..4684ce9fe836 --- /dev/null +++ b/src/main/java/com/thealgorithms/greedyalgorithms/Huffman.java @@ -0,0 +1,77 @@ +// Huffman Coding in Java + +import java.util.PriorityQueue; +import java.util.Comparator; + +class HuffmanNode { + int item; + char c; + HuffmanNode left; + HuffmanNode right; +} + +// For comparing the nodes +class ImplementComparator implements Comparator { + public int compare(HuffmanNode x, HuffmanNode y) { + return x.item - y.item; + } +} + +// IMplementing the huffman algorithm +public class Huffman { + public static void printCode(HuffmanNode root, String s) { + if (root.left == null && root.right == null && Character.isLetter(root.c)) { + + System.out.println(root.c + " | " + s); + + return; + } + printCode(root.left, s + "0"); + printCode(root.right, s + "1"); + } + + public static void main(String[] args) { + + int n = 4; + char[] charArray = { 'A', 'B', 'C', 'D' }; + int[] charfreq = { 5, 1, 6, 3 }; + + PriorityQueue q = new PriorityQueue(n, new ImplementComparator()); + + for (int i = 0; i < n; i++) { + HuffmanNode hn = new HuffmanNode(); + + hn.c = charArray[i]; + hn.item = charfreq[i]; + + hn.left = null; + hn.right = null; + + q.add(hn); + } + + HuffmanNode root = null; + + while (q.size() > 1) { + + HuffmanNode x = q.peek(); + q.poll(); + + HuffmanNode y = q.peek(); + q.poll(); + + HuffmanNode f = new HuffmanNode(); + + f.item = x.item + y.item; + f.c = '-'; + f.left = x; + f.right = y; + root = f; + + q.add(f); + } + System.out.println(" Char | Huffman code "); + System.out.println("--------------------"); + printCode(root, ""); + } +} \ No newline at end of file