1. 赫夫曼樹基本介紹
赫夫曼樹需要先將數組按照從小到大排序,然後操作
public class HuffmanTree {
public static void main(String[] args) {
int arr[] = {13,7,8,3,29,6,1};
Node root = createHuffmanTree(arr);
preOrder(root);
}
//創建赫夫曼樹的方法
public static Node createHuffmanTree(int[] arr){
//1.遍歷arr數組
//2.將arr的每個元素構成一個Node
//3.將Node放到ArrayList中
List<Node> nodes = new ArrayList<Node>();
for(int value:arr){
nodes.add(new Node(value));
}
while (nodes.size()>1){
//排序
Collections.sort(nodes);
//取出根節點權值最小的兩顆二叉樹
Node leftNode = nodes.get(0);
Node rightNode = nodes.get(1);
//構建一顆新的二叉樹
Node parentNode = new Node(leftNode.value+rightNode.value);
parentNode.left = leftNode;
parentNode.right = rightNode;
//從ArrayList中刪除處理過的二叉樹
nodes.remove(leftNode);
nodes.remove(rightNode);
//將parentNode加入到ArrayList中
nodes.add(parentNode);
}
//返回赫夫曼樹的root節點
return nodes.get(0);
}
//前序遍歷
public static void preOrder(Node root){
if(root!=null){
root.preOrder();
}else{
System.out.println("空樹");
}
}
}
//創建節點類
class Node implements Comparable<Node>{
int value;//節點權值
Node left;//左子節點
Node right;//右子節點
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
//前序遍歷
public void preOrder(){
System.out.println(this);
if(this.left!=null){
this.left.preOrder();
}
if(this.right!=null){
this.right.preOrder();
}
}
@Override
public int compareTo(Node o) {
//從小到大排序
return this.value-o.value;
}
}