哈夫曼树的创建及其概念

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;
    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值