完整代码如下:
package com.wqc.tree.huffmantree;
import java.util.*;
/**
* @author 高瞻远瞩
* @version 1.0
* @motto 算法并不可怕, 可怕的是你不敢面对它, 加油!别浮躁~冲击大厂!!!
* 演示wpl哈夫曼树的构建过程 (所有叶子结点带权路径长度之和最小的二叉树)
*/
public class HuffmanTree {
public static void main(String[] args) {
int[] arr = {13,7,8,3,29,6,1};
Node root = huffmanTree(arr);
preOrder(root);
}
public static void preOrder(Node root) {
if(root != null){
root.preOrder();
}else{
System.out.println("树为空");
}
}
public static Node huffmanTree(int[] arr){//传入一个数组 返回根节点
ArrayList<Node> nodes = new ArrayList<>();//此集合作为构建哈夫曼树的中转集合
//1,将数组中的值保存到Node结点中并加入到集合中
for (int value : arr) {
nodes.add(new Node(value));
}
//2,排序
while(nodes.size() > 1) {
// Collections.sort(nodes, new Comparator<Node>() {
// @Override
// public int compare(Node o1, Node o2) {
// return o1.value - o2.value;
// }
// });//本质上这个匿名内部类实现了Comparable接口
Collections.sort(nodes);
// System.out.println(nodes);
//3 从集合中取出第一个作为左结点 第二个作为右结点 将这两个最小值进行结合 生成父结点
Node leftNode = nodes.get(0);
Node rightNode = nodes.get(1);
Node parent = new Node(leftNode.value + rightNode.value);
//4 建立父子关系
parent.left = leftNode;
parent.right = rightNode;
//5 从集合中删除孩子结点 将父结点加入到集合中 循环执行2~5步骤 直到集合中只剩下一个元素
nodes.remove(leftNode);
nodes.remove(rightNode);
nodes.add(parent);
}
return nodes.get(0);
}
}
//实现Comparable接口 可以直接用Collections.sort(nodes)进行排序
class Node implements Comparable<Node>{//创建哈夫曼树的结点类型
int value;
Node left;
Node right;
public Node(int value) {
this.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 String toString() {
return "Node{" +
"value=" + value +
'}';
}
@Override
public int compareTo(Node o) {
return this.value - o.value;
}
}