JAVA實現赫夫曼樹

在這裏插入圖片描述

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
 
class Node<T> implements Comparable<Node<T>> {
    private T data;         //節點數據
    private int weight;     //權值
    private Node<T> left;   //左孩子
    private Node<T> right;  //右孩子
    public Node(T data, int weight) {this.data = data;this.weight = weight;}
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "data:" + this.data + ",weight:" + this.weight + ";   ";
    }
    public int getWeight() {return weight;}
    public Node<T> getLeft() {return left;}
    public void setLeft(Node<T> left) {this.left = left;}
    public Node<T> getRight() {return right;}
    public void setRight(Node<T> right) {this.right = right;}
 
    @Override
    public int compareTo(Node<T> o) {    //重寫這個對象的排序方法,這裏使用權重進行排序
        // TODO Auto-generated method stub
        if (o.weight > this.weight) {
            return 1;
        } else if (o.weight < this.weight) {
            return -1;
        }
        return 0;
    }
}
 
class HuffmanTree<T> {
    public static <T> Node<T> createTree(List<Node<T>> nodes) {   
        while (nodes.size() > 1) {       //只剩一個節點是,退出循環
            Collections.sort(nodes);     
            Node<T> left = nodes.get(nodes.size() - 1);  //取兩個最小的節點
            Node<T> right = nodes.get(nodes.size() - 2);
            Node<T> parent = new Node<T>(null, left.getWeight() + right.getWeight());  //生成新節點,新節點的權值 = 兩個權值最小節點的和
            parent.setLeft(left);
            parent.setRight(right);
            nodes.remove(left);        
            nodes.remove(right);
            nodes.add(parent);          
        }
        return nodes.get(0);            
    }
 
    public static void levelDisplay(Node root) {  
        List<Node> list = new ArrayList<>();
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        //層次遍歷
        while (!queue.isEmpty()) {
            Node pNode = queue.poll();
            System.out.println(pNode.toString());
            if (pNode.getLeft() != null) {
                queue.add(pNode.getLeft());
            }
            if (pNode.getRight() != null) {
                queue.add(pNode.getRight());
            }
        }
    }
}
 
public class HuffmanTreeTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<Node<String>> nodes = new ArrayList<Node<String>>();
        nodes.add(new Node<String>("A", 5));
        nodes.add(new Node<String>("B", 2));
        nodes.add(new Node<String>("C", 7));
        nodes.add(new Node<String>("D", 9));
        Node<String> root = HuffmanTree.createTree(nodes);
        HuffmanTree.levelDisplay(root);
    }
 
}

運行結果:

data:null,weight:23;
data:D,weight:9;
data:null,weight:14;
data:null,weight:7;
data:C,weight:7;
data:B,weight:2;
data:A,weight:5;

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