构造哈夫曼树

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);    

    }
}

 

posted @ 2019-08-13 17:03  LeeJuly  阅读(238)  评论(0)    收藏  举报