package compression; import java.util.HashMap; import java.util.Vector; public class HuffmanTree implements Comparable { protected Node root; protected HashMap codeTable; HuffmanTree() { root = null; } HuffmanTree(int _val, int _weight) { codeTable = new HashMap (256); root = new Node(_val, _weight); codeTable.put(_val, root); } HuffmanTree(HuffmanTree left, HuffmanTree right) { int weight = left.GetWeight() + right.GetWeight(); root = new Node(left.root.data, weight); root.left = left.root; root.right = right.root; root.left = root.right = root; codeTable.putAll(left.codeTable); codeTable.putAll(right.codeTable); } public int GetWeight() { return root.GetWeight(); } protected static class Node { Node left, right, parent; int data; int weight; private Vector encodValue; Node(int newData, int weight, Node _parent) { left = null; right = null; data = newData; parent = _parent; } Node(int newData, int weight) { this(newData, weight, null); } Node(int newData) { this(newData, 0); } int GetWeight() { return weight; } Vector GetEncodValue() { return encodValue; } void print(String prefix) { if (left == null && right == null) System.out.printf(prefix + "[%c]\n", this.data); if (left != null) left.print(prefix + "-"); if (right != null) right.print(prefix + "-"); } void computeEncodValue(Vector prefix) { if (prefix.size() >= 8 || (prefix == null)) System.out.println("ERREUR"); if (left == null && right == null) encodValue = prefix; else encodValue = null; if (left != null) { Vector leftPrefix = (Vector) prefix.clone(); leftPrefix.add(false); left.computeEncodValue(leftPrefix); } if (right != null) { Vector leftPrefix = (Vector) prefix.clone(); leftPrefix.add(true); left.computeEncodValue(leftPrefix); } } public void incWeight() { weight++; } } public int compareTo(Object o) { int ow = ((HuffmanTree) o).GetWeight(); if (ow > this.GetWeight()) return -1; else if (ow < this.GetWeight()) return 1; else // Si les poids sont egaux, on utilise la valeur de l'etiquette { int oVal = ((HuffmanTree) o).root.data; if (oVal > this.root.data) return -1; else if (oVal < this.root.data) return 1; return 0; } } public void ComputeEncodValues() { this.root.computeEncodValue(new Vector ()); } public void printTree() { root.print(""); } }