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;