代码如下:

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();}
}

Java实现Huffman哈夫曼树相关推荐

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

    代码如下: package HuffmanTreeArrays;import java.util.ArrayList; import java.util.Scanner;public class Hu ...

  2. Huffman霍夫曼树,霍夫曼编码

    霍夫曼树基本概念: 路径:从一个结点往下到孩子或孙子结点之间的同理 路径长度:如结点1到结点7的路径长度=2 结点的权:将结点的某一属性值作为结点的权 带权路径长度:从根节点到该结点*该结点的权:如结 ...

  3. Huffman哈夫曼树编码字符,binarytree,Python

    Huffman哈夫曼树(霍夫曼树,赫夫曼树)在通信领域最主要的应用是数据编码.假设现在有A.B.C.D.E五个字符,它们出现的概率或者权值不同,从A到E,权值依次降低,那么就可以用哈夫曼最优二叉树对其 ...

  4. 每日四题打卡-4.15:耍杂技的牛/贪心绝对值不等式-货仓选址/贪心排序不等式-排队打水/huffman哈夫曼树-合并果子

    耍杂技的牛 具体:https://blog.csdn.net/qq_27262727/article/details/105515507 农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此 ...

  5. Java数据压缩算法——哈夫曼树

    --在这个特殊的日子里,向烈士们致敬!!! 目录 一.简介 二.实现思路 2.1 路径 2.2 节点的权及带权路径长度 2.3 树的带权路径长度 2.4 霍夫曼树的定义 2.5 构造霍夫曼树 三.代码 ...

  6. 【Java数据结构】赫夫曼树

    哈弗曼树 哈弗曼树定义 哈弗曼树示例 哈弗曼树代码实现 哈弗曼树定义 给定 N 个权值作为 N 个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈 ...

  7. 哈夫曼树原理及Java编码实现

    文章目录 前言 一.哈夫曼树原理 二.哈夫曼编码(Java题解) 参考资料 前言 所有博客文件目录索引:博客目录索引(持续更新) 源代码:Gitee-Huffman.java.Github-Huffm ...

  8. java振动数据压缩_【数据结构-Java】最佳实践-数据压缩(使用赫夫曼树)

    一.需求 将给出的一段文本,比如 "i like like like java do you like a java" , 根据前面的讲的赫夫曼编码原理,对其进行数据压缩处理 二. ...

  9. 最优二叉树(哈夫曼树)Java实现

    此篇博客讲最优二叉树也叫哈夫曼树的原理,以及构建步骤,还有哈夫曼编码原理.建议有二叉树基础朋友学习交流.对二叉树基础可以看我的另外一篇博客二叉树的构建以及遍历 文章目录 哈夫曼树引出: 哈夫曼树原理及 ...

最新文章

  1. 转:Hibernate中Criteria和DetachedCriteria的完整用法
  2. PIC单片机入门_PICC头文件介绍
  3. 编程python爬取网页数据教程_实例讲解Python爬取网页数据
  4. python网络爬虫之requests模块
  5. SpringCloud配置中心内容加密
  6. Pthread创建线程后必须使用join或detach释放线程资源
  7. [hackerrank]Manasa and Stones
  8. 拳王虚拟项目公社:闲鱼怎么卖虚拟资源商品,会不会被封号?虚拟资源自动化出售
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线学习管理系统源码
  10. matlab 动画_MATLAB的动画制作和视频录制
  11. 如何使用组托管服务帐户(GMSA)保护Reporting Services
  12. 图像处理基本概念、术语
  13. 大麦盒子无线服务器连接超时,大麦盒子游戏联网失败怎么办
  14. matlab 求矩阵各行的平均值
  15. python实现聊天工具_python开发简单的聊天工具
  16. 【Java】问题记录:fastjson中JSON.isValid()方法校验JSON合法性的BUG
  17. LSB图像数字水印嵌入算法(含python代码)
  18. 你真的了解串口 (Serial)吗?
  19. 修复计算机命令行,命令提示符修复系统方法
  20. Hadoop的fsck工具

热门文章

  1. 【专升本计算机】甘肃省专升本计算机基础--判断题--汇编(737道带答案)
  2. Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别
  3. Android之导入项目提示Android requires compiler compliance level 5.0 or 6.0. Found ‘1.8‘ instead解决办法
  4. Android之使用AIDL时的跨进程回调—Server回调Client
  5. 求字符串里面数字之和
  6. Android之常见面试题
  7. 《零基础看得懂的C语言入门教程 》——(三)轻轻松松理解第一个C语言程序
  8. css实战手册第四版 pdf_你真的了解CSS继承吗?看完必跪
  9. 一根火柴可以将一瓶大可乐吊起来吗?
  10. 开车走吗?朋友......