赫夫曼树

赫夫曼树

赫夫曼树,又称最优二叉树:它是n个带权叶子结点构成的所有二叉树中,带权路径长度最小的二叉树.

树的带权路径长度 WPL:树种所有叶子结点的带权路径长度之和.

叶子节点的带权路径值:叶子结点的权值乘以根节点到叶子结点的路径(层)

节点定义:

public class Node implements Comparable<Node> {

    int value;
    Node left;
    Node right;

    public Node(int value) {
        this.value=value;
    }

    @Override
    public int compareTo(Node o) {
        return this.value-o.value;
    }

    @Override
    public String toString() {
        return "Node [value=" + value + "]";
    }

}

创建赫夫曼树

public class HuffmanTree {

    public static void main(String[] args) {
        int[] arr=new int[] {3,7,29,14,8,11,5,23};
        Node huffManTree=huffmanTree(arr);
        System.err.println(huffManTree);
    }

    public static Node huffmanTree(int[] arr) {
        List<Node> list=new ArrayList<>();
        //构建树
        for(int value:arr) {
            list.add(new Node(value));
        }
        while(list.size()>1) {
            //排序
            Collections.sort(list);
            //查找出最小的树
            Node left=list.get(list.size()-1);
            //查找出次小的树
            Node right=list.get(list.size()-2);
            //组成新树
            Node newNode=new Node(left.value+right.value);
            list.remove(left);
            list.remove(right);
            //添加新树
            list.add(newNode);
        }
        return list.get(0);
    }
}