Java实现Huffman哈夫曼树

代码如下:

package HuffmanTree;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class HuffmanTree {private class TreeNode{private int val;private TreeNode left;private TreeNode right;public TreeNode(){val = 0;left = right = null;}public TreeNode(int e){val = e;left = right = null;}}private TreeNode data[];private int size;private TreeNode TreeRoot;public HuffmanTree(int n){TreeRoot = null;data = new TreeNode[n+1];Scanner sc = new Scanner(System.in);for (int i = 1;i<=n;i++){TreeNode t = new TreeNode(sc.nextInt());data[i] = t;size++;}for (int i = size/2;i>0;i--){percDown(i);}}private void percDown(int p){TreeNode x = data[p];int parent,child;for (parent = p;parent*2 <=size;parent = child){child = 2*parent;if (child!=size && data[child].val > data[child+1].val){child++;}if (x.val <= data[child].val) break;else data[parent] = data[child];}data[parent] = x;}private TreeNode deleteMin(){TreeNode minData = data[1];TreeNode x = data[size--];int parent,child;for (parent = 1;parent*2<=size;parent = child){child = 2*parent;if (child!=size && data[child].val > data[child+1].val){child++;}if (x.val <= data[child].val) break;else data[parent] = data[child];}data[parent] = x;return minData;}private void insertHeap(TreeNode e){int i = ++size;for (;i>1 && data[i/2].val > e.val ;i = i/2){data[i] = data[i/2];}data[i] = e;}public void buildHuffmanTree(){TreeNode t;int cnt = size;for (int i = 1;i<cnt;i++){t = new TreeNode();t.left = deleteMin();t.right = deleteMin();t.val = t.left.val+t.right.val;insertHeap(t);}TreeRoot = deleteMin();}private void printNode(TreeNode e){System.out.print(e.val+" ");if (e.left!=null) System.out.print("left = "+e.left.val+" ");else System.out.print("left = null ");if (e.right!=null) System.out.print("right = "+e.right.val+" ");else System.out.print("right = null ");System.out.println();}public void levelOrder(){Queue<TreeNode> q = new LinkedList<>();q.add(TreeRoot);while(!q.isEmpty()){TreeNode t = q.poll();printNode(t);if (t.left!=null) q.add(t.left);if (t.right!=null) q.add(t.right);}}public void codeHuffmanTree(){ArrayList<Integer> arrays = new ArrayList<>();if (TreeRoot==null){System.out.println(arrays);return ;}dfsNode(TreeRoot,arrays);}private void dfsNode(TreeNode root,ArrayList<Integer> arrays){if (root.left==null && root.right==null){System.out.println(root.val+" = "+arrays);return ;}if (root.left!=null){arrays.add(0);dfsNode(root.left,arrays);arrays.remove(arrays.lastIndexOf(0));}if (root.right!=null){arrays.add(1);dfsNode(root.right,arrays);arrays.remove(arrays.lastIndexOf(1));}}}

测试类如下:

package HuffmanTree;public class TestHuffmanTree {public static void main(String[] args){HuffmanTree hf = new HuffmanTree(7);hf.buildHuffmanTree();hf.levelOrder();hf.codeHuffmanTree();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用交付老兵眼中的Envoy, 云原生时代下的思考

Envoy 是云原生时代的明星&#xff0c;其本质是反向代理负载均衡类软件&#xff0c;领域上归于应用交付&#xff0c;那么作为应用交付领域的老兵如何看待 Envoy&#xff0c;Envoy 又引发了哪些关于传统应用交付领域的思考&#xff1f;关于作者林静&#xff0c;F5 软件方向解决方…

给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

给定一个n节点二叉树&#xff0c;写出一个O(n)时间的非递归的过程&#xff0c;将该树每个结点的关键字输出。要求除该树本树的存储空间外只能使用固定量的额外存储空间&#xff0c;且过程中不得修改该树&#xff0c;即使是暂时的修改也不允许。 &#xff08;算法导论第三版第十…

Java实现Huffman哈夫曼树(数组实现)

代码如下: package HuffmanTreeArrays;import java.util.ArrayList; import java.util.Scanner;public class HuffmanTree {private class TreeNode{private int val;private int left;private int right;private int parent;public TreeNode(){val 0;left -1;right -1;par…

asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!

背景最近一段时间&#xff0c;陆陆续续的把手里头项目都迁移到了k8s中&#xff0c;期间遇到很多的坑&#xff0c;并且也学到了许多k8s的知识&#xff08;从0-1&#xff09;&#xff0c;大家都知道k8s中的一大特性是自动扩容&#xff0c;对此结合自己的业务发现很是有“用武之地…

非递归遍历二叉树(算法导论第三版第十章10.4-5)

非递归遍历二叉树&#xff08;算法导论第三版第十章10.4-5&#xff09; template<typename T> void TraverseBinaryTreeNonRecursive(BinaryTreeNode<T>* root) {BinaryTreeNode<T>* prev nullptr;BinaryTreeNode<T>* current root;while (current!…

图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visited[]为全局变量&#xff0c;已经初始化为false */ void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ) { /* 以V为出发点对邻接表存储…

如何优雅做系统错误提示?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「149」篇原创敬上大家好&#xff0c;我是Z哥。不管是日常的工作中还是生活中&#xff0c;我们每天会用到很多软件系统。不知道你有没有过这样的感受&#xff0c;当…

搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目

前言伴随着随着微服务概念的不断盛行&#xff0c;与之对应的各种解决方案也层出不穷。这毕竟是一个信息大爆发的时代&#xff0c;各种编程语言大行其道&#xff0c;各有各的优势。但是有一点未曾改变&#xff0c;那就是他们服务的方式&#xff0c;工作的时候各司其职&#xff0…

dijkstra算法和floyd算法(C语言)

dijkstra算法: /* 邻接表存储 - 无权图的单源最短路算法 *//* dist[]和path[]全部初始化为-1 */ void Unweighted ( LGraph Graph, int dist[], int path[], Vertex S ) {Queue Q;Vertex V;PtrToAdjVNode W;Q CreateQueue( Graph->Nv ); /* 创建空队列, MaxSize为外部定义…

辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟,二叉树结点)

辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟&#xff0c;二叉树结点&#xff09; template<typename T> class BinaryTreeNodeLeftChildRightSibling { public:T key;BinaryTreeNodeLeftChildRightSibling<T>* parent;BinaryTreeNodeLeftChildRightS…

如何在ASP.NET Core中集成ElasticSearch

本文来自&#xff1a;https://www.blexin.com/en-US/Article/Blog/How-to-integrate-ElasticSearch-in-ASPNET-Core-70图片我敢打赌&#xff0c;您肯定会被要求向Web应用程序中添加高级搜索功能&#xff0c;而且通常是全文的类似Google的搜索。在技术电子商务的开发过程中&…

prim算法和kruskal算法(C语言)

prim算法: /* 邻接矩阵存储 - Prim最小生成树算法 */Vertex FindMinDist( MGraph Graph, WeightType dist[] ) { /* 返回未被收录顶点中dist最小者 */Vertex MinV, V;WeightType MinDist INFINITY;for (V0; V<Graph->Nv; V) {if ( dist[V]!0 && dist[V]<Min…

利用链表实现可合并堆(算法导论第三版思考题10-2)

利用链表实现可合并堆&#xff08;算法导论第三版思考题10-2&#xff09; a 链表已排序 创建一个空堆&#xff1a; Θ(1) 插入&#xff1a;Θ(n)&#xff0c;插入后依然保持排序 最小值&#xff1a;Θ(1)&#xff0c;第一位便是 取最小值&#xff1a;Θ(1) 合并&#xff1a;Θ…

了解下C#由转换二进制所引起的思考

【导读】最近遇到很有意思转换二进制的问题&#xff0c;有部分童鞋俨然已了解&#xff0c;可能也有一部分童鞋没碰到过也就不知情&#xff0c;这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时&#xff0c;非常开心&#xff0c;收到再一次连任MVP的邮件&#xff0c…

拓扑排序(C语言)

代码如下: /* 邻接表存储 - 拓扑排序算法 */bool TopSort( LGraph Graph, Vertex TopOrder[] ) { /* 对Graph进行拓扑排序, TopOrder[]顺序存储排序后的顶点下标 */int Indegree[MaxVertexNum], cnt;Vertex V;PtrToAdjVNode W;Queue Q CreateQueue( Graph->Nv );/* 初始化…

假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)

假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。你所给的过程在最坏情况下的运行时间是多少。 &#xff08;算法导论第十一章11.1-1&#xff09; #include "KeyNode.h" template<typename T> KeyNode<T>* direct…

如何利用.NETCore向Azure EventHubs准实时批量发送数据?

最近在做一个基于Azure云的物联网分析项目&#xff1a;.netcore采集程序向Azure事件中心(EventHubs)发送数据&#xff0c;通过Azure EventHubs Capture转储到Azure BlogStorage&#xff0c;供数据科学团队分析。为什么使用Azure事件中心&#xff1f;Azure事件中心是一种Azure上…

C++实现二叉树

代码如下: #include<iostream> #include <queue> #include <stack> using namespace std;class BinTree { private:class TreeNode{public:int data;TreeNode *left;TreeNode *right;TreeNode ():data(0),left(nullptr),right(nullptr){}TreeNode(int e):da…

辅助类KeyNode

#ifndef C11LEARN_KEYNODE_H #define C11LEARN_KEYNODE_H template<typename T> class KeyNode { public:int key{};T value; public:KeyNode() default;KeyNode(int key,const T value):key(key),value(value){} }; #endif //C11LEARN_KEYNODE_H

MySql :Could not create connection to database server.

错误&#xff1a; Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. The error …