哈夫曼樹

哈夫曼樹

wpl帶權路徑長度最小的樹

  • 二叉樹樹的思想:
  1. 創建節點,
  2. 創建二叉樹,
  3. 其中二叉樹的操作都定義在節點類裏面,二叉樹類裏調用這些方法,其中定義方法的時候以一個節點爲二叉樹遞歸定義。因爲一個節點就是一顆二叉樹。

package binaryTree.huffmanTree;

import java.util.*;

/**
 * @Author: 白雄雄
 * @Date: 2019/9/13 16:30
 */
public class HuffmanTree {

    public static void main(String[] args) {
        int[] arrays = {13,7,4,8,29,1,5,6};
        Node huffmanTree = createHuffmanTree(arrays);
        //對生成的哈夫曼樹進行遍歷
        Node.preOrder(huffmanTree);
    }

    /**
     * 創建哈夫曼樹
     * @param arrays
     */
    public static Node createHuffmanTree(int[] arrays) {
        List nodes = new ArrayList<Node>();
        for (int i = 0; i < arrays.length; i++) {
            nodes.add(new Node(arrays[i]));
        }
        //升序排列節點
        Collections.sort(nodes);
        //最後只剩root節點
        while (nodes.size() > 1) {
            //第一個節點一定最小作爲左子樹
            Node leftNode = (Node) nodes.get(0);
            Node rightNode = (Node) nodes.get(1);
            //構造父節點
            Node node = new Node(leftNode.getValue() + rightNode.getValue());
            //設置左右子樹
            node.setLeftNode(leftNode);
            node.setRightNode(rightNode);
            //刪除掉構建完的子樹
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            nodes.add(node);
            Collections.sort(nodes);
        }
        return (Node) nodes.get(0);
    }
}

/**
 * 創建哈夫曼樹節點
 */
class Node implements Comparable<Node> {

    private int value;
    //左子樹
    private Node leftNode;
    //又子樹
    private Node rightNode;

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

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

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

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

    public int getValue() {
        return value;
    }

    public Node getLeftNode() {
        return leftNode;
    }

    public Node getRightNode() {
        return rightNode;
    }

    /**
     * 對哈夫曼樹升序排序使用
     * @param o
     * @return
     */
    @Override
    public int compareTo(Node o) {
        return this.value - o.value;
    }

    /**
     * 對生成的哈夫曼樹進行前序遍歷
     * @param root
     */
    public static void preOrder(Node root) {
        if (root == null) {
            System.out.println("哈夫曼樹爲空");
            return;
        }
        Node node = root;
        System.out.println(node.getValue());
        if (node.getLeftNode() != null) {
            preOrder(node.getLeftNode());
        }
        if (node.getRightNode() != null) {
            preOrder(node.getRightNode());
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章