首页 > 其他分享 >赫夫曼树

赫夫曼树

时间:2022-11-29 23:01:45浏览次数:30  
标签:Node value public nodes leftNode 节点 夫曼

赫夫曼树

  • 定义:WPL最小的二叉树就是赫夫曼树WPL全称weight path length,中文意思是树的带权路径长度,规定为所有叶子节点的带权路径长度之和,计算方法是权值*带权路径长度

权值,也就是给某一节点赋予的值大小

带权路径长度,为权值所在层数-1

  • 如果该树的wpl最小,则是最优二叉树

image-20221128230239327

  • 代码:
package com.guodaxia.huffman;

import java.util.ArrayList;
import java.util.Collections;

/**
 * 哈夫曼树创建
 * @ author Guo daXia
 * @ create 2022/11/28
 */
public class HuffmanDemo {
    public static void main(String[] args) {
        int[] arr={13,8,7,3};//排序后:{3,7,8,13}
        Node huffmanTree = createHuffmanTree(arr);
        preOrder(huffmanTree);
    }
    /**
     * 方法:创建赫夫曼树
     * @param arr 二叉树
     * @return  返回一个创建好的赫夫曼树的root
     */
    public static Node createHuffmanTree(int[] arr){

        //使用Java集合存储每个元素
        //1.遍历数组
        //2.数组的每个元素构成一个个Node
        //3.将Node放入到ArrayList中
        ArrayList<Node> nodes = new ArrayList<>();
        for (int value:arr){
            Node node = new Node(value);
            nodes.add(node);
        }
        while (nodes.size()>1){
            //排序
            Collections.sort(nodes);
            //取出根节点权值最小的两颗 二叉树
            Node leftNode = nodes.get(0);
            Node rightNode = nodes.get(1);
            //构成一颗新的 二叉树
            Node parent = new Node(leftNode.value + rightNode.value);
            parent.leftNode=leftNode;
            parent.rightNode=rightNode;
            //删除两个旧节点(从ArrayList中)
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            //将parent加入到ArrayList中
            nodes.add(parent);
        }
        //此时,剩下一颗 二叉树,即为哈夫曼树
        return nodes.get(0);//返回root
    }
    //前序遍历方法
    public static void preOrder(Node root){
        if (root!=null){
            root.preOrder();
        }else {
            System.out.println("空树,不能遍历!");
        }
    }
}
//节点类
class Node implements Comparable<Node>{
    Node leftNode;
    Node rightNode;
    int value;//节点权值

    public Node(int value) {
        this.value = value;
    }

    @Override
    public int compareTo(Node o) {
        return this.value-o.value;//升序
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }

    //前序遍历
    public void preOrder(){
        //先输出root节点
        System.out.println(this);
        if (this.leftNode!=null){
            this.leftNode.preOrder();
        }
        if (this.rightNode!=null){
            this.rightNode.preOrder();
        }
    }
}
  • 运行结果:

Node{value=31}
Node{value=13}
Node{value=18}
Node{value=8}
Node{value=10}
Node{value=3}
Node{value=7}

image-20221128234932648
  • 总结:
    1. 哈夫曼树好比一串葡萄,所有的叶子节点是原二叉树的节点,通过将叶子节点权值最大的放在首层,将第二大权值放在第二层,直到所有叶子节点挂上。
    2. 哈夫曼树计算机运算快
    3. wpl为构建出哈夫曼树的除了叶子节点的权值之和

标签:Node,value,public,nodes,leftNode,节点,夫曼
From: https://www.cnblogs.com/container-simple/p/16937014.html

相关文章

  • 【数据结构-树】哈夫曼树及其应用
    目录1哈夫曼树的构造2哈夫曼树的应用——哈夫曼编码3相关例子1哈夫曼树的构造将n个结点作为n棵仅含一个节点的二叉树,构成森林F在F中选取两棵权值最小的二叉......
  • 哈夫曼树
    哈夫曼树一、哈夫曼树的基本概念路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。结点的路径长度:两结点间路径上的分支数。结点数目相同的......
  • 7-1 哈夫曼树哈夫曼编码
    输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。输入格式:第一行输入叶子结点个数,接着依次输入权值。输出格式:输出哈夫曼编码,输出带权路径长度。输......
  • 哈夫曼树哈夫曼编码
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e3+10;typedefstructnode{ intw; structnode*l; structnode*r;}node;strings[N*N];intsum[N*......
  • 哈夫曼应用
    哈夫曼编码应用问题描述​给定字符串,将每个不同的字符的哈夫曼编码表示并输出其哈夫曼编码,并再将其哈夫曼编码还原回字符串分析一下构建哈夫曼树​使......
  • C/C++文件压缩与解压(哈夫曼编码)
    C/C++文件压缩与解压(哈夫曼编码)实验四:文件压缩与解压一、实验目的:掌握哈夫曼编码和解码二、实验内容:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降......
  • 贪心算法-构造哈夫曼数及生成哈夫曼编码,编程实现
    哈夫曼树1.概念:给定n个权值最为n个叶子的节点,构建成一颗二叉树。如果次树的带权路径长度最小,则称此二叉树为最优二叉树,也叫哈夫曼树。WLP:带权路径长度公式:Wk:第......
  • 二叉树可视化 - 哈夫曼树
    哈夫曼树可视化importmatplotlib.pyplotaspltclassTree:def__init__(self,weight=None,left=None,right=None):self.weight=weights......
  • 赫夫曼树及其应用
    前言:最基本的压缩编码方法——赫夫曼(huffman)编码。在了解赫夫曼编码之前,我们必须了解一下赫夫曼树,赫夫曼编码就是基于赫夫曼树实现的。相关视频——【C语言描述】《数据......
  • 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码
    1.贪心算法概览贪心算法是一种算法思想。希望能够满足限制的情况下将期望值最大化。比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树等问题都希望满足限制的情......