七、赫夫曼树





代码实现
package Tree.HuffManTree;
import java.util.ArrayList;
import java.util.Collections;
public class HuffManDemo {
public static void main(String[] args) {
int[] arr = {13,7,8,3,29,6,1};
Node root = createHuffManTree(arr);
preOrder(root);
}
//前序遍历
public static void preOrder(Node root){
if (root!=null){
root.preOrder();
} else {
System.out.println("空树,不能遍历");
}
}
//创建赫夫曼树,返回赫夫曼树的root节点
public static Node createHuffManTree(int[] arr){
//为了操作方便:1、遍历arr数组,2、将其中每个元素构建成一个Node,3、将其放入ArrayList中
ArrayList<Node> nodes = new ArrayList<>();
for (int value : arr) {
Node temp = new Node(value);
nodes.add(temp);
}
while (nodes.size()>1){
//排序
Collections.sort(nodes);
//取出根节点最小的两个二叉树(节点)
Node leftNode = nodes.get(0);
Node rightNode = nodes.get(1);
//构建一颗新的二叉树
Node parent = new Node(leftNode.value+rightNode.value);
parent.left=leftNode;
parent.right=rightNode;
//干掉用过的这俩节点
nodes.remove(leftNode);
nodes.remove(rightNode);
//把新的parent节点加入到数组中
nodes.add(parent);
}
//返回赫夫曼树的root节点
return nodes.get(0);
}
}
//创建节点类
//为了让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) {
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();
}
}
}