赫夫曼树
基本介绍
赫夫曼树几个重要概念和举例说明
赫夫曼树创建步骤思路图解
代码实现
package huffmantree;
import java.util.ArrayList;
import java.util.Collections;
public class HuffmanTree {
public static void main(String[] args) {
int arr[]=new int[]{13,7,8,3,29,6,1};
Node root = createHuffmanTree(arr);
//测试:
preOrder(root);
}
// 创建 哈夫曼树的方法
/*
* @Param arr 需要创建成赫夫曼树的数组
* @return 创建好的赫夫曼树的root结点
* */
public static Node createHuffmanTree(int[] arr) {
// 第一步 为了操作方便 遍历arr数组 将arr的元素 构建成一个Node 将Node放入ArrayList
ArrayList<Node> nodes = new ArrayList<>();
for (int value : arr) {
nodes.add(new Node(value));
}
//循环过程
while (nodes.size()>1){
// 排序 从小到大
Collections.sort(nodes);
// System.out.println("nodes:"+nodes);
//取出根节点权值最小的两颗二叉树
//1.取出权值最小的结点(二叉树)
Node leftNode = nodes.get(0);
//2.取出权值第二小的结点(二叉树)
Node rightNode = nodes.get(1);
//3.构建一颗新的二叉树
Node parent = new Node(leftNode.value + rightNode.value);
parent.left=leftNode;
parent.right=rightNode;
//4.从ArrayList中删除处理过的二叉树
nodes.remove(leftNode);
nodes.remove(rightNode);
//5.将parent加入nodes
nodes.add(parent);
Collections.sort(nodes);
// System.out.println(nodes);
}
return nodes.get(0); }
//编写一个前序遍历的方法
public static void preOrder(Node root){
if (root!=null){
root.preOrder();
}else {
System.out.println("是空树,不能遍历");
}
}
}
// 创建节点类
// 为了让Node 支持Collections集合排序 让Node实现Comparable接口
class Node implements Comparable<Node>{
int value; // 节点权值
Node left; // 指向左子节点
Node right; // 指向右子节点
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
@Override
public int compareTo(Node o) {
// 从小到大的排序
// 从大到小 -(this.value - o.value)
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();
}
}
}
测试!!