package com.interview.algorithms.greedy; import com.interview.basics.model.collection.heap.BinaryArrayHeap; import com.interview.basics.model.tree.BinaryTreeNode; /** * Created_By: stefanie * Date: 14-9-20 * Time: 下午11:40 */ public class C13_2_HuffmanEncode { static class CharNode implements Comparable<CharNode>{ int index; int frequency; BinaryTreeNode node; CharNode(int index, int frequency) { this.index = index; this.frequency = frequency; } @Override public int compareTo(CharNode o) { if(frequency > o.frequency) return 1; else if(frequency < o.frequency) return -1; else return 0; } } public static String[] encode(int[] frequency){ BinaryArrayHeap<CharNode> heap = new BinaryArrayHeap<CharNode>(BinaryArrayHeap.MIN_HEAD); for(int i = 0; i < frequency.length; i++) heap.add(new CharNode(i, frequency[i])); while(heap.size() > 1){ CharNode n1 = heap.pollHead(); CharNode n2 = heap.pollHead(); BinaryTreeNode<Integer> left = null; BinaryTreeNode<Integer> right = null; left = n1.node == null? new BinaryTreeNode<>(n1.index) : n1.node; right = n2.node == null? new BinaryTreeNode<>(n2.index) : n2.node; BinaryTreeNode<Integer> parent = new BinaryTreeNode<>(-1); parent.setLeft(left); parent.setRight(right); CharNode p = new CharNode(-1, n1.frequency + n2.frequency); p.node = parent; heap.add(p); } BinaryTreeNode<Integer> root = heap.pollHead().node; String[] codes = new String[frequency.length]; getCode(root, "", codes); return codes; } private static void getCode(BinaryTreeNode<Integer> node, String prefix, String[] codes){ if(node == null) return; if(node.value != -1) codes[node.value] = prefix; getCode(node.left, prefix + "0", codes); getCode(node.right, prefix + "1", codes); } }