import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.TreeMap;
class nodecomparator implements Comparator<node>{
public int compare(node x, node y)
{
if (x.val < y.val)
return -1;
if (x.val > y.val)
return 1;
return 0;
}
}
public class test {
//make the hash map
public static Map<Character, Integer> makemap(String str) {
Map<Character, Integer> m = new TreeMap<Character, Integer>();
int n = str.length();
for(int i = 0; i < n; i++) {
Character tmp = str.charAt(i);
if(!Character.isLetter(tmp)) continue;
Integer freq = m.get(tmp);
m.put(tmp, freq == null ? 1: freq + 1);
}
return m;
}
<span style="white-space:pre"> </span>//generate the hash tree
public static node maketree(LinkedList<node> list) {
Comparator<node> com = new nodecomparator();
do {
node a = list.poll();
node b = list.poll();
list.add(new node(a.val+b.val, a, b));
Collections.sort(list, com);
}while(list.size() != 1);
return list.poll();
}
<span style="white-space:pre"> </span>//generate the hash code for each letter
public static void makecode(node head, String str,ArrayList<String> ans) {
if(head.isleaf) {ans.add(str+head.ch);return;}
else{
makecode(head.left, "0" + str, ans);
makecode(head.right, "1" + str, ans);
}
}
public static void printtree(node a) {
if(a == null) return;
System.out.println(a.val);
printtree(a.left);
printtree(a.right);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Character, Integer> t = makemap("aaaaffabbb ,.bii");
Iterator<?> it = t.entrySet().iterator();
Comparator<node> com = new nodecomparator();
List<node> list = new LinkedList<node>();
while(it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
list.add(new node((Integer)pair.getValue(), (Character)pair.getKey(), true));
}
Collections.sort(list,com);
node head = maketree((LinkedList<node>) list);
ArrayList<String> a = new ArrayList<String>();
makecode(head, "",a);
for(String c: a) {
System.out.println(c);
}
}
}