基本概念
什么是赫夫曼树
给一组数据,构建一颗huffman树
思路:
举例实现过程:
数据:13,7,8,3,29,6,1
1、第一步
排序:1,3,6,7,8,13,29
2、第二步
找最小的两个权值,组成新树
3、第三步
重复上述步骤(排序+组成新树),直到只剩一个权值
图解如下:
代码实现:
/**
* 为了让Node实现排序,实现Comparable的compareTo方法
*/
@Data
public class Node implements Comparable<Node> {
private int value;
private Node left;
private Node right;
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
@Override
public int compareTo(Node o) {
//从小到大
return this.value - o.value;
}
/**
* 前序遍历,为了打印Huffman树的结果
*/
public void preOrder() {
System.out.println(this);
if (this.left != null) {
this.left.preOrder();
}
if (this.right != null) {
this.right.preOrder();
}
}
}
public class HuffmanTreeDemo {
public static void main(String[] args) {
int[] arr = {13,7,8,3,29,6,1};
Node root= createHuffmanTree(arr);
preOrder(root);
}
private static void preOrder(Node node){
if(node != null){
node.preOrder();
}else{
System.out.println("空树");
}
}
private static Node createHuffmanTree(int[] arr){
//创建节点
List<Node> nodeList = new ArrayList<>();
for (int i : arr) {
nodeList.add(new Node(i));
}
while(nodeList.size() >1){
//排序
Collections.sort(nodeList);
//取根结点权值最小的两棵树
Node left = nodeList.get(0);
Node right = nodeList.get(1);
//组成新树
Node newNode = new Node(left.getValue()+right.getValue());
newNode.setLeft(left);
newNode.setRight(right);
//删除两颗旧的树,添加新的树
nodeList.remove(left);
nodeList.remove(right);
nodeList.add(newNode);
}
return nodeList.get(0);
}
}
前序遍历结果:
Node{value=67}
Node{value=29}
Node{value=38}
Node{value=15}
Node{value=7}
Node{value=8}
Node{value=23}
Node{value=10}
Node{value=4}
Node{value=1}
Node{value=3}
Node{value=6}
Node{value=13}