1.什么是哈夫曼树?
哈夫曼树是一颗特殊的二叉树,具体如何特殊,说明如下:
首先我们需要理解几个概念:
1)带权值路径总和 = w1*k1 + w2*k2 + w3*k3 +......+ wn*kn
这里的wn指的是第n个带权值结点,而kn是第n棵带权值结点的深度(距离根结点的最短路径)
假设现在给我们如下带权值结点:
int[] value = new int[]{3,1,2,4,5};
以及四个不带权值(也不存储任何数据)的空结点
我们可以构造出如下几颗树:
我们会发现!不同的树对应有不同的WPL(也就是带权值路径总和),那么什么是哈夫曼树呢?哈夫曼树就是WPL最小的那棵树。
创建代码如下:
package 算法and数据结构.数据结构.哈夫曼树;
import java.util.ArrayDeque;
import java.util.Arrays;
/*
huffmanTree的存储内容有:
指向最优孩子的指针
权值
指向父亲的指针
特点:
想要成为huffmanTree必须要使带权路径和最小。
即WPL最小
*/
public class Node {
Node left ;
Node right;
//这里我们暂时只记录当前结点是否具有权值
Integer value ;
boolean isYZ = false;
public Node(){
left = right = null;
value = null ;
}
public Node(Integer value,boolean isYZ){
this.isYZ = isYZ ;
this.value = value;
}
public Node(Node left , Node right){
this.left = left;
this.right = right;
}
public void pre(){
System.out.println("value-->: "+value+" Is叶子?--->: "+isYZ);
if(this.left != null){
this.left.pre();
}
if(this.right != null){
this.right.pre();
}
}
}
class HuffmanTree{
public static void main(String[] args) {
int[] number_value = new int[]{13,7,8,3,29,6,1};
Node root = creatHuffmanTree(number_value);
root.pre();
}
public static Node creatHuffmanTree(int[] number_value){
//首先我们需要一个队列(只要是队列就行(栈也是可以的))
ArrayDeque<Integer> value_queue = new ArrayDeque<>();
//首先进行排序
Arrays.sort(number_value);
//存储进队列中
for(Integer value : number_value){
value_queue.add(value);
}
Node root = null;
Node node1 = new Node(value_queue.poll(),true);
/*
这里构造的方法如下图解释:
我们每一次都构造一个空结点作为新的树根,从队列中出列两个元素
构成一颗新的二叉树,如此重复次操作。
*/
while (value_queue.size() > 0){
root = new Node();
Node node2 = new Node(value_queue.poll(),true);
root.left = node1;
root.right = node2;
node1 = root;
}
return root;
}
}