哈夫曼樹
wpl帶權路徑長度最小的樹
- 二叉樹樹的思想:
- 創建節點,
- 創建二叉樹,
- 其中二叉樹的操作都定義在節點類裏面,二叉樹類裏調用這些方法,其中定義方法的時候以一個節點爲二叉樹遞歸定義。因爲一個節點就是一顆二叉樹。
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());
}
}
}