目的:用最少的二进制位数来对一串字符串进行编码
构造方法:统计字符串中的每个不同字符的频数,创建频数表将频数最小的两个字符作为子节点构成二叉树,将其值之和放入频数表中,继续构造,直到频数表中元素个数为1
import java.util.ArrayList;
import java.util.Collections;
public class TestHuffmanTree {
public static void main(String[] args) {
int arr[]=new int[]{3,7,8,29,5,11,23,14};
System.out.println(createHuffmanTree(arr).getData());
}
public static void SelectSort(ArrayList<TreeNode> list){
for (int i = 0; i < list.size()-1; i++) {
int index=i;
for(int j=i+1;j<list.size();j++){
if(list.get(j).getData()<list.get(index).getData())
index=j;
}
Collections.swap(list,i,index);
}
}
public static TreeNode createHuffmanTree(int[] arr){
//先为所有的元素创建节点
ArrayList<TreeNode> nodes=new ArrayList<>();
for (int i = 0; i < arr.length; i++)
nodes.add(new TreeNode(arr[i]));
while(nodes.size()>1){
SelectSort(nodes);
TreeNode root=new TreeNode(nodes.get(0).getData()+nodes.get(1).getData());
if(nodes.get(0).getData()>nodes.get(1).getData()){
root.setLeft(nodes.get(1));
root.setRight(nodes.get(0));
}
else {
root.setLeft(nodes.get(0));
root.setRight(nodes.get(1));
}
nodes.remove(0);
nodes.remove(0);
nodes.add(root);
}
System.out.println(nodes.size());
return nodes.get(0);
}
}