package com.iteye.caoruntao.huffman;
import java.util.Comparator;
import java.util.PriorityQueue;
/**
* @author caoruntao
*
*/
public class Huffman {
private PriorityQueue<Character> characters;
public Huffman(Character[] characers){
this.characters = new PriorityQueue<Character>(6,new Comparator<Character>(){
@Override
public int compare(Character a, Character b) {
return (a.getFrequency() - b.getFrequency());
}
});
for (Character character : characers) {
this.characters.add(character);
}
}
public void computeHuffman(){
for(int i = 1; i < 6; i++){
Character a = this.characters.poll();
Character b = this.characters.poll();
Character newNode = new Character(a.getFrequency()+b.getFrequency());
newNode.setLeftSon(a);
newNode.setRightSon(b);
this.characters.add(newNode);
}
}
public void printResult(Character c){
if(c.getLeftSon() != null){
System.out.print("0 ");
printResult(c.getLeftSon());
}
if(c.getRightSon() != null){
System.out.print("1 ");
printResult(c.getRightSon());
}
if(c.getLeftSon() == null && c.getRightSon() == null){
System.out.print(":"+c.getX());
System.out.println();
}
}
static class Character{
private int frequency;
private char x;
private Character leftSon;
private Character rightSon;
public Character(int frequency, char x){
this.frequency = frequency;
this.x = x;
}
public Character(int frequency){
this.frequency = frequency;
}
public Character getLeftSon() {
return leftSon;
}
public void setLeftSon(Character leftSon) {
this.leftSon = leftSon;
}
public Character getRightSon() {
return rightSon;
}
public void setRightSon(Character rightSon) {
this.rightSon = rightSon;
}
public int getFrequency() {
return frequency;
}
public char getX() {
return x;
}
public String toSring(){
return this.x + " " + this.frequency;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] testChS = new char[]{'f','e','c','b','d','a'};
int[] testChF = new int[]{5,9,12,13,16,45};
Character[] ChS = new Character[6];
for(int i=0; i<6; i++){
Huffman.Character c = new Huffman.Character(testChF[i],testChS[i]);
ChS[i] = c;
}
Huffman huffman = new Huffman(ChS);
huffman.computeHuffman();
huffman.printResult(huffman.characters.poll());
}
}