創建簡單的赫夫曼樹

概述

赫夫曼樹是一種最優二叉樹,權值越大的節點離根節點越近的二叉樹纔是最優二叉樹。

創建赫夫曼樹
/**
 * @Description 赫夫曼樹中的節點
 * @auther Eleven
 * @create 2020-04-06 15:31
 **/
public class Node  implements Comparable{

    int value;

    Node leftNode;

    Node rightNode;

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

    public int getValue() {
        return value;
    }

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

    public Node getLeftNode() {
        return leftNode;
    }

    public void setLeftNode(Node leftNode) {
        this.leftNode = leftNode;
    }

    public Node getRightNode() {
        return rightNode;
    }

    public void setRightNode(Node rightNode) {
        this.rightNode = rightNode;
    }

    @Override
    public String toString() {
        return ("當前節點的值爲:"+this.value);
    }

    @Override
    public int compareTo(Object obj) {
        return -(this.value - ((Node)obj).value);
    }
}
/**
 * @Description 創建一個赫夫曼樹
 * @auther Eleven
 * @create 2020-04-06 15:33
 **/
public class HuffmanTree {

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

    //創建赫夫曼樹
    public static Node createTree(int[] arr){
        List<Node> nodes = new ArrayList<>();
        //將數組變爲若干個節點
        for (int i = 0;i<arr.length;i++){
            Node node = new Node(arr[i]);
            nodes.add(node);
        }

        while (nodes.size()>1) {
            //對node進行排序 降序排序
            Collections.sort(nodes);
            //輸出排序後的結果
            System.out.println(nodes);
            //獲取左側樹節點
            Node leftNode = nodes.get(nodes.size() - 1);
            //獲取右側樹節點
            Node rightNode = nodes.get(nodes.size() - 2);
            //創立一個父節點 值爲左右節點相加
            int parentVal = leftNode.value + rightNode.value;
            Node parentNode = new Node(parentVal);
            //設置左右子節點
            parentNode.setLeftNode(leftNode);
            parentNode.setRightNode(rightNode);
            //從list中移除掉左右節點
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            //將父節點添加到node集合中
            nodes.add(parentNode);
        }
        return nodes.get(0);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章