public static <T> void getValuesAndBitLengths(final List<T> values, final List<Integer> lens, final HuffmanTree<T> tree) { final TreeMap<T, HuffmanBitCode<T>> codes = new TreeMap<T, HuffmanBitCode<T>>(); getBitCode(tree, new HuffmanBitCode<T>(), codes); for (final T value : codes.keySet()) { final HuffmanBitCode<T> code = codes.get(value); values.add(value); lens.add(code.bitLength); } }
private static <T> void getBitCode(final HuffmanTree<T> tree, final HuffmanBitCode<T> code, final Map<T, HuffmanBitCode<T>> codes) { if (tree instanceof HuffmanLeaf) { final HuffmanLeaf<T> leaf = (HuffmanLeaf<T>) tree; final HuffmanBitCode<T> readyCode = new HuffmanBitCode<T>(); readyCode.bitCode = code.bitCode; readyCode.bitLength = code.bitLength; codes.put(leaf.value, readyCode); } else if (tree instanceof HuffmanNode) { final HuffmanNode<T> node = (HuffmanNode<T>) tree; // traverse left code.bitCode = code.bitCode << 1; code.bitLength++; getBitCode(node.left, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; // traverse right code.bitCode = code.bitCode << 1 | 1; code.bitLength++; getBitCode(node.right, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; } } }
private static <T> void getBitCode(final HuffmanTree<T> tree, final HuffmanBitCode<T> code, final Map<T, HuffmanBitCode<T>> codes) { if (tree instanceof HuffmanLeaf) { final HuffmanLeaf<T> leaf = (HuffmanLeaf<T>) tree; final HuffmanBitCode<T> readyCode = new HuffmanBitCode<T>(); readyCode.bitCode = code.bitCode; readyCode.bitLength = code.bitLength; codes.put(leaf.value, readyCode); } else if (tree instanceof HuffmanNode) { final HuffmanNode<T> node = (HuffmanNode<T>) tree; // traverse left code.bitCode = code.bitCode << 1; code.bitLength++; getBitCode(node.left, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; // traverse right code.bitCode = code.bitCode << 1 | 1; code.bitLength++; getBitCode(node.right, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; } } }
public static <T> void getValuesAndBitLengths(final List<T> values, final List<Integer> lens, final HuffmanTree<T> tree) { final TreeMap<T, HuffmanBitCode<T>> codes = new TreeMap<T, HuffmanBitCode<T>>(); getBitCode(tree, new HuffmanBitCode<T>(), codes); for (final T value : codes.keySet()) { final HuffmanBitCode<T> code = codes.get(value); values.add(value); lens.add(code.bitLength); } }