首页 > 其他分享 >赫夫曼树的实现

赫夫曼树的实现

时间:2022-12-05 18:25:35浏览次数:25  
标签:Node preOrder 实现 value int nodes public 夫曼

package HuffmanTrere;

import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import java.util.ArrayList;
import java.util.Collection;
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 root=createHuffmanTree(arr);
   preOrder(root);
    }
    public static void preOrder(Node root){
        if(root!=null){
            root.preOrder();

        }
        else {
            System.out.println("是空树,不能遍历");
        }
    }
    public static Node createHuffmanTree(int []arr){
        List<Node> nodes=new ArrayList<Node>();
        for(int value :arr){
            nodes.add(new Node(value));

        }
        while (nodes.size()>1) {
            //排序从小到大
            Collections.sort(nodes);
            System.out.println("nodes" + nodes);
            //取出权值最小的数
            Node leftNode = nodes.get(0);
            //取出权值第二小的数
            Node rightNode = nodes.get(1);
            //构建一颗二叉树
            Node parentNode = new Node(leftNode.value + rightNode.value);
            parentNode.right = rightNode;
            parentNode.left = leftNode;
            //从array中删除处理过的二叉树
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            nodes.add(parentNode);

        }
        return nodes.get(0);
        //返回赫尔曼夫的root根节点
    }
}
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; //表示从小到大排序
    }
}

image

标签:Node,preOrder,实现,value,int,nodes,public,夫曼
From: https://www.cnblogs.com/JK8395/p/16953080.html

相关文章

  • .NET 6 基于IDistributedCache实现Redis与MemoryCache的缓存帮助类
    本文通过IDistributedCache的接口方法,实现Redis与MemoryCache统一帮助类。只需要在配置文件中简单的配置一下,就可以实现Redis与MemoryCache的切换。目录IDistributedCache......
  • 云计算数据中心如何实现快速部署
     云计算的环境中资源和应用规模变化大,部署过程所支持的软件系统形式多样,系统结构各不相同,因此对快速部署的要求较高。为了进一步提高云环境中虚拟机的部署速度,则需要考虑......
  • java对接webservice服务实现推送
    【背景】  前不久接到一个任务需要将我们平台的内容推送到第三方的一个webService服务中,我们平台接口使用java来做的,所以需要通过java调用webService服务实现推送效果,不......
  • 通过postgres_fdw实现跨库访问
    瀚高数据库目录文档用途详细信息 文档用途介绍Postgresql跨库访问中postgres_fdw的使用方法 详细信息PostgreSQL外部数据包装器,即PostgreSQLForeignDataWrappers......
  • [C++11与并发编程]5、使用条件变量和互斥锁实现信号量
    使用条件变量和互斥锁实现信号量layout:posttitle:使用条件变量和互斥锁实现信号量categories:cpp_concurrencydescription:C++并发编程简介keywords:c++,并发编......
  • el-table实现单选
    handleSelectionChange(v){this.multipleSelection=v;if(v.length>1){varnewRows=v.filter((it,index)=>{if(index==......
  • SeriLog 实现多文件
      有一万个理由,按业务输出日志,关注某个业务的变化,磁盘够大的话,仍然可以在一个主文件中再写一份日志,即一份日志写全部的日志,另一些日志,则按业务分开这些文件,最普通的做法......
  • Influxdb 接入HTTP终端实现报警自定义
    十年河东,十年河西,莫欺少年穷学无止境,精益求精influxdb的报警由以下三种组成   1、创建检查   红色框为绝对值检查,绿色框为【死人检查】,这里选择绝对值检......
  • IDEA配置自定义标签,实现高亮注释~
    为什么要写这么一篇博客呢?不知道大家有没有这样的一种苦恼,就是在写代码的时候遇到复杂的核心的代码,想加一个特殊的注释方便后期自己或者同事查看,但是这玩意IDEA好像只给我......
  • 邻接表存储实现图的深度优先遍历
    编写程序,实现由邻接表存储实现无向图的深度优先搜索遍历的功能。顶点为字符型。输入格式:第一行输入顶点个数及边的个数,第二行依次输入各顶点,第三行开始依次输入边的两个......