文章目录
赫夫曼树
一、几个概念
二、赫夫曼树实现源码
代码如下(示例):
package HuffmanTree;
import java.util.ArrayList;
import java.util.Collections;
public class HuffmanTree {
public static void main(String[] args) {
int[] arr = {
13, 7, 8, 3, 29, 6, 1};
Node root = CreatHaffmanTree(arr);
PreOrder(root);
}
/**
*
* @param arr 给出需要创建赫夫曼树的数组
* @return 返回赫夫曼树的root节点
*/
public static Node CreatHaffmanTree(int[] arr) {
//创建一个ArrayList集合,将arr中的数以节点的形式放入ArrayList中
ArrayList<Node> arrayList = new ArrayList<Node>();
for (int n : arr) {
arrayList.add(new Node(n));
}
while (arrayList.size() > 1) {
//对ArrayList集合中的元素进行排序
Collections.sort(arrayList);
//将ArrayList中的前2个节点取出来组合成一个赫夫曼树
Node leftnode = arrayList.get(0);
Node rightnode = arrayList.get(1);
Node parentnode = new Node(leftnode.value + rightnode.value);
parentnode.left = leftnode;
parentnode.right = rightnode;
//移除已经组成赫夫曼树的两个节点
arrayList.remove(leftnode);
arrayList.remove(rightnode);
//然后将父节点加入到原始的arraylist中
arrayList.add(parentnode);
}
return arrayList.get(0);
}
//实现前序打印
public static void PreOrder(Node root) {
if (root != null) {
root.PreOrder();
} else {
System.out.println("赫夫曼树为空");
}
}
}
//对Collections集合进行排序,实现Comparable接口
class Node implements Comparable<Node> {
public int value;
public Node left;
public 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;
}
//实现前序排序
public void PreOrder() {
System.out.println(this);
if (this.left != null) {
this.left.PreOrder();
}
if (this.right != null) {
this.right.PreOrder();
}
}
}
总结
主要思路是先进行排序,这里直接利用集合中的Comparable接口实现,然后就是将前面2个小节点排序成赫夫曼树,知道最后一个节点。