public static <T> HuffmanTree<T> buildTree(final int[] charFrequencies, final T[] values) { final LinkedList<HuffmanTree<T>> list = new LinkedList<HuffmanTree<T>>(); for (int i = 0; i < charFrequencies.length; i++) if (charFrequencies[i] > 0) list.add(new HuffmanLeaf<T>(charFrequencies[i], values[i])); final Comparator<HuffmanTree<T>> comparator = new Comparator<HuffmanTree<T>>() { @Override public int compare(final HuffmanTree<T> o1, final HuffmanTree<T> o2) { return o1.frequency - o2.frequency; } }; while (list.size() > 1) { Collections.sort(list, comparator); // dumpList(list) ; final HuffmanTree<T> left = list.remove(); final HuffmanTree<T> right = list.remove(); list.add(new HuffmanNode<T>(left, right)); } return list.isEmpty() ? null : list.remove(); }
public static <T> HuffmanTree<T> buildTree(final int[] charFrequencies, final T[] values) { final LinkedList<HuffmanTree<T>> list = new LinkedList<HuffmanTree<T>>(); for (int i = 0; i < charFrequencies.length; i++) if (charFrequencies[i] > 0) list.add(new HuffmanLeaf<T>(charFrequencies[i], values[i])); final Comparator<HuffmanTree<T>> comparator = new Comparator<HuffmanTree<T>>() { @Override public int compare(final HuffmanTree<T> o1, final HuffmanTree<T> o2) { return o1.frequency - o2.frequency; } }; while (list.size() > 1) { Collections.sort(list, comparator); // dumpList(list) ; final HuffmanTree<T> left = list.remove(); final HuffmanTree<T> right = list.remove(); list.add(new HuffmanNode<T>(left, right)); } return list.isEmpty() ? null : list.remove(); }