构造哈夫曼树
public class HuffmanTree { static class HTNode{ int data;//节点号,对每个节点的唯一标记 int weight; HTNode left; HTNode right; public HTNode(int data, int weight) { this.data = data; this.weight = weight; } } int item=4; //构造哈夫曼树 private HTNode createTree(List<HTNode> nodes) { // 只要nodes数组中还有2个以上的节点 while (nodes.size() > 1) { Collections.sort(nodes,new Comparator<HTNode>() { @Override public int compare(HTNode o1, HTNode o2) { // TODO Auto-generated method stub return o1.weight-o2.weight; } }); //获取权值最小的两个节点 HTNode left = nodes.get(0); HTNode right = nodes.get(1); //生成新节点,新节点的权值为两个子节点的权值之和 HTNode parent = new HTNode(item++, left.weight + right.weight); //让新节点作为两个权值最小节点的父节点 parent.left = left; parent.right = right; //删除权值最小的两个节点 nodes.remove(0); nodes.remove(0); //将新节点加入到集合中 nodes.add(parent); } return nodes.get(0); } //层次遍历二叉树 public List<HTNode> breadthFirst(HTNode root){ Queue<HTNode> queue = new LinkedList<HTNode>(); List<HTNode> list = new ArrayList<HTNode>(); if(root!=null){ //将根元素加入“队列” queue.offer(root); } while(!queue.isEmpty()){ //将该队列的“队尾”元素加入到list中 list.add(queue.peek()); HTNode p = queue.poll(); //如果左子节点不为null,将它加入到队列 if(p.left != null){ queue.offer(p.left); } //如果右子节点不为null,将它加入到队列 if(p.right != null){ queue.offer(p.right); } } return list; } public static void main(String[] args) { List<HTNode> nodes = new ArrayList<HTNode>(); nodes.add(new HTNode(0, 1)); nodes.add(new HTNode(1, 3)); nodes.add(new HTNode(2, 5)); nodes.add(new HTNode(3, 7)); HuffmanTree m=new HuffmanTree(); HTNode root = m.createTree(nodes); ArrayList<HTNode> list=(ArrayList<HTNode>) m.breadthFirst(root); } }
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/11347026.html
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号