Huffman树

博客介绍了赫夫曼树的基本概念,详细阐述了给一组数据构建赫夫曼树的思路。以数据13,7,8,3,29,6,1为例,说明了构建过程,包括排序、找最小权值组成新树并重复操作,最后提到了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

什么是赫夫曼树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

给一组数据,构建一颗huffman树

思路:
在这里插入图片描述
举例实现过程:
数据:13,7,8,3,29,6,1
1、第一步
排序:1,3,6,7,8,13,29
2、第二步
找最小的两个权值,组成新树
3、第三步
重复上述步骤(排序+组成新树),直到只剩一个权值

图解如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码实现:

/**
 * 为了让Node实现排序,实现Comparable的compareTo方法
 */
@Data
public class Node implements Comparable<Node> {
    private int value;
    private Node left;
    private 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;
    }

    /**
     * 前序遍历,为了打印Huffman树的结果
     */
    public void preOrder() {
        System.out.println(this);
        if (this.left != null) {
            this.left.preOrder();
        }
        if (this.right != null) {
            this.right.preOrder();
        }
    }
}


public class HuffmanTreeDemo {
    public static void main(String[] args) {
        int[] arr = {13,7,8,3,29,6,1};
        Node root= createHuffmanTree(arr);
        preOrder(root);

    }

    private static void preOrder(Node node){
        if(node != null){
            node.preOrder();
        }else{
            System.out.println("空树");
        }
    }

    private static Node createHuffmanTree(int[] arr){
        //创建节点
        List<Node> nodeList = new ArrayList<>();
        for (int i : arr) {
            nodeList.add(new Node(i));
        }


        while(nodeList.size() >1){
            //排序
            Collections.sort(nodeList);
            //取根结点权值最小的两棵树
            Node left = nodeList.get(0);
            Node right = nodeList.get(1);
            //组成新树
            Node newNode = new Node(left.getValue()+right.getValue());
            newNode.setLeft(left);
            newNode.setRight(right);
            //删除两颗旧的树,添加新的树
            nodeList.remove(left);
            nodeList.remove(right);
            nodeList.add(newNode);

        }
        return nodeList.get(0);
    }
}

前序遍历结果:
Node{value=67}
Node{value=29}
Node{value=38}
Node{value=15}
Node{value=7}
Node{value=8}
Node{value=23}
Node{value=10}
Node{value=4}
Node{value=1}
Node{value=3}
Node{value=6}
Node{value=13}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值