哈夫曼树的构建

哈夫曼树的构建

1.定义

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

2.构造

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

3代码实现

public class HuffManTree {


    public static void createHuffmanTree(int[] arr) {
        //方便排序先将数组转成ArrayList
        List<Node> nodes = new ArrayList<Node>();
        for (int i : arr) {
            nodes.add(new Node(i));
        }
        
        /*
            循环将最小的两 个数组成新的二叉树
            然后将最小的数移除
            将新的二叉树放到数组中
            直达数组中只剩一个数为止
            
         */
        while (nodes.size() > 1) {
            //排序
            Collections.sort(nodes, new NodeComparator());
            //取出最小的两位将其组合一个新的二叉树
            Node leftNode = nodes.get(0);
            Node rightNode = nodes.get(1);
            Node parent = new Node(leftNode.getValue() + rightNode.getValue());
            parent.setLeft(leftNode);
            parent.setRight(rightNode);
            //将其从数组中移除
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            //把新的节点放入数组中。
            nodes.add(parent);
        }


    }

}

class Node {
    private int value;
    private Node left;
    private Node right;
    
    public Node(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }
    
}
//实现比较接口
class NodeComparator implements Comparator<Node> {

    @Override
    public int compare(Node o1, Node o2) {
        return o1.getValue() - o2.getValue();
    }
}

你可能感兴趣的:(数据结构与算法,二叉树,数据结构)