概述
赫夫曼树是一种最优二叉树,权值越大的节点离根节点越近的二叉树才是最优二叉树。
创建赫夫曼树
/**
* @Description 赫夫曼树中的节点
* @auther Eleven
* @create 2020-04-06 15:31
**/
public class Node implements Comparable{
int value;
Node leftNode;
Node rightNode;
public Node(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getLeftNode() {
return leftNode;
}
public void setLeftNode(Node leftNode) {
this.leftNode = leftNode;
}
public Node getRightNode() {
return rightNode;
}
public void setRightNode(Node rightNode) {
this.rightNode = rightNode;
}
@Override
public String toString() {
return ("当前节点的值为:"+this.value);
}
@Override
public int compareTo(Object obj) {
return -(this.value - ((Node)obj).value);
}
}
/**
* @Description 创建一个赫夫曼树
* @auther Eleven
* @create 2020-04-06 15:33
**/
public class HuffmanTree {
public static void main(String[] args) {
int[] arr = new int[]{3,7,8,29,5,11,23,14};
Node node = createTree(arr);
System.out.println(node);
}
//创建赫夫曼树
public static Node createTree(int[] arr){
List<Node> nodes = new ArrayList<>();
//将数组变为若干个节点
for (int i = 0;i<arr.length;i++){
Node node = new Node(arr[i]);
nodes.add(node);
}
while (nodes.size()>1) {
//对node进行排序 降序排序
Collections.sort(nodes);
//输出排序后的结果
System.out.println(nodes);
//获取左侧树节点
Node leftNode = nodes.get(nodes.size() - 1);
//获取右侧树节点
Node rightNode = nodes.get(nodes.size() - 2);
//创立一个父节点 值为左右节点相加
int parentVal = leftNode.value + rightNode.value;
Node parentNode = new Node(parentVal);
//设置左右子节点
parentNode.setLeftNode(leftNode);
parentNode.setRightNode(rightNode);
//从list中移除掉左右节点
nodes.remove(leftNode);
nodes.remove(rightNode);
//将父节点添加到node集合中
nodes.add(parentNode);
}
return nodes.get(0);
}
}
赫夫曼树构建详解
1万+

被折叠的 条评论
为什么被折叠?



