赫夫曼树:给定n个权值(只能是叶子)作为n个叶子节点,构成一颗二叉树,使得该数的带权路径长度(wpl)最小.
用数组完成
package day19;
import java.util.ArrayList;
import java.util.Collections;
//思考:根据left和right构造了一个哈夫曼树保存在了数组里面。
public class 哈夫曼树 {
public static void main(String[] args) {
int[] arr ={13,7,8,3,29,6,1};
node root = createhefuman(arr);
perorder(root);
}
// 前序遍历
public static void perorder(node root){
if (root!=null){
root.preorder();
}else {
System.out.println("为空树");
}
}
// 创建赫夫曼殊方法
public static node createhefuman(int[] arr){
// 为了操作方便
// 1.遍历arr
// 2.将arr的每个元素构建成node
// 3,将node放入到arraylist中。
ArrayList<node> nodes = new ArrayList<node>();
for (int value:arr){
nodes.add(new node(value)); //将数组每个元素构建成节点(带有权值),然后加入到数组里面。
}
//排序
while (nodes.size()>1) {
Collections.sort(nodes); //node实现了Comparable接口,可以用方法排序。
System.out.println("nodes= " + 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);
// 加入
nodes.add(parent);
}
return nodes.get(0);
}
}
//节点类
//为了让node支持排序,集合。 让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();
}
}
}