概述
赫夫曼樹是一種最優二叉樹,權值越大的節點離根節點越近的二叉樹纔是最優二叉樹。
創建赫夫曼樹
/**
* @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);
}
}