哈夫曼树
1、树的结点(=父节点+左孩子+右孩子+信息元素)
/**
* 树的结点
* @author Administrator
*
*/
public class TreeNode {
//结点中的信息元素
int num;
//父结点
TreeNode parent = null;
//左结点
TreeNode left = null;
//右结点
TreeNode right = null;
//构造函数
public TreeNode(int num){
this.num = num;
}
}
2、一个重要的接口:Comparator(比较容器)
使用模板:
Public class 类名 implements Comparator<E>{
Public int compare(int a,int b){
Return ****;
}
}
/**
* 创建一个比较的容器
*/
class MyComparator implements Comparator<TreeNode>{
public int compare(TreeNode node1, TreeNode node2) {
return node1.num - node2.num;
}
}
3、一个重要的优先队列:PriorityQueue<E>;
性质: 加入的元素可以根据我们自己设计的比较方式(比较容器)进行自动排序;
使用模板:
PriorityQueue<E> list = new PriorityQueue<E>(初始化大小, new MyComparator());
4、
import java.util.Comparator;
import java.util.PriorityQueue;
/**
* 构造树
* @author Administrator
*
*/
public class Tree {
/**
* 构造函数
*/
public Tree(int[] array){
TreeNode rootnode = ListToTree(ArrayToList(array));
PrintTree(rootnode);
}
/**
* 创建一个可以自动排序的队列,并且将数组放入这个队列之中
*/
public PriorityQueue<TreeNode> ArrayToList(int array[]){
//根据比较容器创建一个优先队列
PriorityQueue<TreeNode> list = new PriorityQueue<TreeNode>(11, new MyComparator());
for(int i=0;i<array.length;i++){
//创建结点对象
TreeNode node = new TreeNode(array[i]);
//将结点一个个放入优先队列
list.add(node);
}
//返回这个优先队列
return list;
}
/**
* 将优先队列自动转化为树结构
*/
public TreeNode ListToTree(PriorityQueue<TreeNode> list){
while(list.size() > 1){
//先取出前两个结点
TreeNode node1 = list.poll();
TreeNode node2 = list.poll();
//通过这两个结点构建一棵基础三角树
TreeNode root = new TreeNode(node1.num + node2.num);
root.left = node1;
root.right = node2;
node1.parent = root;
node2.parent = root;
//将新结点放入队列
list.add(root);
}
//取出最后一个结点
TreeNode root = list.poll();
return root;
}
/**
* 遍历整棵树
*/
public void PrintTree(TreeNode node){
if(node != null){
//输出树
System.out.println(node.num);
TreeNode left = node.left;
PrintTree(left);
TreeNode right = node.right;
PrintTree(right);
}
}
/**
* 创建一个比较的容器
*/
class MyComparator implements Comparator<TreeNode>{
public int compare(TreeNode node1, TreeNode node2) {
return node1.num - node2.num;
}
}
}