• 数据结构:赫夫曼树


    1. 基本介绍

    • 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为Huffman Tree
    • 赫夫曼树是带权路径长度最短的树,权值较大的节点离根较近。

    2. 重要概念

    1. 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根结点到第L层结点的路径长度为L-1
    2. 节点的权及带权路径长度:若将树中节点赋给一个有着某种含义的数值,则这个数值称为该节点的权。节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积
    3. 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树。
    4. WPL最小的就是赫夫曼树

    在这里插入图片描述

    3. 创建图解

    • 数列 {13, 7, 8, 3, 29, 6, 1},要求转成一颗赫夫曼树
    1. 从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树,{1, 3, 6, 7, 8, 13, 29 }
    2. 取出根节点权值最小的两颗二叉树
    3. 组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和
    4. 再将这颗新的二叉树,以根节点的权值大小再次排序, 不断重复 1-2-3-4 的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树

    在这里插入图片描述

    4. 代码实现

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class HuffmanTree {
    
        public static void main(String[] args) {
            int[] arr = {13, 7, 8, 3, 29, 6, 1};
            Node huffmanTree = createHuffmanTree(arr);
            huffmanTree.preOrder();
        }
    
        /**
         * 创建赫夫曼树的方法
         *
         * @param arr 需要创建成赫夫曼树的数组
         * @return 创建后返回树的root节点
         */
        public static Node createHuffmanTree(int[] arr) {
            // 遍历数组,将arr的每个元素构成一个node放入List中
            List<Node> nodes = new ArrayList<>();
            for (int value : arr) {
                nodes.add(new Node(value));
            }
            while (nodes.size() > 1) {
                // 排序,从小到大
                Collections.sort(nodes);
                System.out.println("nodes = " + nodes);
                // 1.取出根节点权值最小和次小的2个节点
                Node leftNode = nodes.get(0);
                Node rightNode = nodes.get(1);
                // 2.构建新的二叉树
                Node parent = new Node(leftNode.value + rightNode.value);
                parent.left = leftNode;
                parent.right = rightNode;
                // 3.从List中删除处理过的节点
                nodes.remove(leftNode);
                nodes.remove(rightNode);
                // 4.将parent加入到List中
                nodes.add(parent);
            }
            // 返回树的根节点
            return nodes.get(0);
        }
    
    
        // 创建节点
        static class Node implements Comparable<Node> {
            int value;
    
            Node left;
    
            Node right;
    
            // 前序遍历
            public void preOrder() {
                System.out.println(this);
                if (this.left != null) {
                    this.left.preOrder();
                }
                if (this.right != null) {
                    this.right.preOrder();
                }
            }
    
            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;
            }
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
  • 相关阅读:
    Hive用户中文使用手册系列(四)
    Maven的安装与配置&工程创建
    365天搞定八股文——Day 005 MQ中的重要概念
    吉比特第三季营收13亿:靠“羊了个羊”走红 卢竑岩获分红3亿
    Zookeeper的功能简介
    MySQL基本操作和基于MySQL基本操作的综合实例项目
    算法--单链表
    在linux中配置固定ip
    BevFusion (2): nuScenes 数据介绍及点云可视化
    牛客刷题总结——Python入门:列表数据类型
  • 原文地址:https://blog.csdn.net/qq_40977118/article/details/126680208