什么是哈弗曼树

1.哈弗曼树是最优二叉树,树的带权路径长度最小的一个二叉树。

2.带权路径长度为根节点到该节点的路径长度和该节点权重的乘积。
3.路径长度为当前节点到另一个节点所经过的分支的个数(边的个数)。

应用场景

哈弗曼树可以用来求哈弗曼编码,通过对文件中不同数据出现的频率,
设计出新的编码方式,来对文件进行数据压缩。

建立哈弗曼树

1.将表示不同数据的节点按照出现的频率(权重)进行排序。

2.选取出两个最小频率(权重)的数据,创建新节点,作为新节点的两个子节点。
3.将两个子节点从原有的节点集删除,计算新节点的权重,并将其加入到节点集合中。
4.对新的节点集进行排序,重复2和3步骤,直到节点集中只有一个节点。

代码实现

package com.newer.tree;

/**
* 哈弗曼树中每个节点的信息
*
* @author lixiaochi
*
*/
public class HuffmaNode {
// 当前节点的数据
String name;
// 当前节点的权重
int value;
// 当前节点所对应的哈弗曼编码
String encode; // 当前节点的左右子节点
HuffmaNode leftChild;
HuffmaNode rightChild; // Hafuman节点的构造方法
public HuffmaNode(String name, int value) {
super();
this.name = name;
this.value = value;
} public HuffmaNode(String name, int value, HuffmaNode leftChild, HuffmaNode rightChild) {
super();
this.name = name;
this.value = value;
this.leftChild = leftChild;
this.rightChild = rightChild;
} @Override
public String toString() {
return "HuffmaNode [name=" + name + ", value=" + value + ", encode=" + encode + "]";
} }
package com.newer.tree;
/**
*           我的哈弗曼树
* 什么是哈弗曼树:哈弗曼树是最优二叉树,树的带权路径长度最小的一个二叉树。
* 带权路径长度为根节点到该节点的路径长度和该节点权重的乘积。
* 路径长度为当前节点到另一个节点所经过的分支的个数(边的个数)。
*
* 应用场景:哈弗曼树可以用来求哈弗曼编码,通过对文件中不同数据出现的频率,
* 设计出新的编码方式,来对文件进行数据压缩。
* 建立哈弗曼树:
* 1.将表示不同数据的节点按照出现的频率(权重)进行排序。
* 2.选取出两个最小频率(权重)的数据,创建新节点,作为新节点的两个子节点。
* 3.将两个子节点从原有的节点集删除,计算新节点的权重,并将其加入到节点集合中。
* 4.对新的节点集进行排序,重复2和3步骤,直到节点集中只有一个节点。
*        
* @author lixiaochi
*
*/
public class MyHuffmanTree {
// 哈弗曼树的根节点
HuffmaNode root; public static void main(String[] args) {
MyHuffmanTree huffmantree = new MyHuffmanTree();
// 数组中的元素是一个节点,节点中有数据内容和出现的频率。
HuffmaNode[] nodeArray = new HuffmaNode[6];
// 哈弗曼树中各个节点的初始化。
nodeArray[0]=new HuffmaNode("A",27);
nodeArray[1]=new HuffmaNode("B",8);
nodeArray[2]=new HuffmaNode("C",15);
nodeArray[3]=new HuffmaNode("D",15);
nodeArray[4]=new HuffmaNode("E",30);
nodeArray[5]=new HuffmaNode("F",5); // 创建一颗哈弗曼树
huffmantree.root = huffmantree.create(nodeArray); // 对哈弗曼树进行编码,其实可以在生成哈弗曼树的时候,一起生成哈弗曼编码。
encode(huffmantree.root); // 按先序的方式输出哈弗曼树的每个节点的信息。
print(huffmantree.root); } public static HuffmaNode create(HuffmaNode[] nodeArray) { // 表示当前要排序的起始位置
int num = 0; // 不断循环,一直到节点集只有一个节点。
while(num<nodeArray.length-1) {
// 对当前节点集进行排序,使用了最简单的选择排序。
// 可以使用高效的排序方法,快排,归排都可以。
for(int i=num;i<nodeArray.length;i++) {
int min=i;
for(int j=i+1;j<nodeArray.length;j++) {
if(nodeArray[j].value<nodeArray[min].value) {
min=j;
}
}
swap(nodeArray,i,min);
} // 创建新节点,记录新节点的权重
int newNodeValue = nodeArray[num].value+nodeArray[num+1].value;
HuffmaNode newNode = new HuffmaNode("分支节点",newNodeValue,nodeArray[num],nodeArray[num+1]);
// 将节点加入到节点集中,这里的num表示的起始位置,已经实现了在节点集数组中删除两个节点。
nodeArray[++num] = newNode;
}
return nodeArray[num];
} private static void swap(HuffmaNode[] nodeArray, int i, int min) {
HuffmaNode temp = nodeArray[i];
nodeArray[i] = nodeArray[min];
nodeArray[min] = temp;
} public static void encode(HuffmaNode node) {
encode(node,"0","1","");
} // 对哈弗曼树中叶子节点进行编码。
public static void encode(HuffmaNode node,String a,String b,String c) {
if(node.leftChild != null) {
String temp = c+"0";
encode(node.leftChild,"0","1",temp);
}
if(node.rightChild != null) {
String temp = c+"1";
encode(node.rightChild,"0","1",temp);
}
if(node.leftChild==null && node.rightChild==null) {
node.encode=c;
} } // 按先序的方式输出哈弗曼树的每个节点的信息。
public static void print(HuffmaNode node) {
if(node != null) {
System.out.println(node);
print(node.leftChild);
print(node.rightChild);
}
} }

显示结果

Java---Huffman树的实现的更多相关文章

  1. Java蓝桥杯练习题——Huffman树

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...

  2. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Huffman树与编码的简单实现

    好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的.注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了. package other; import ...

  4. 数据结构(二十七)Huffman树和Huffman编码

    Huffman树是一种在编码技术方面得到广泛应用的二叉树,它也是一种最优二叉树. 一.霍夫曼树的基本概念 1.结点的路径和结点的路径长度:结点间的路径是指从一个结点到另一个结点所经历的结点和分支序列. ...

  5. Huffman树与Huffman编码

    1.Huffman树 今天复习Huffman树.依稀记得自己被Huffman树虐的经历.还记得是7月份,我刚开始看数据结构与算法,根本看不懂Huffman树的操作.后来我终于悟出了Huffman树是怎 ...

  6. Huffman树、霍夫曼编码

    Huffman树指的是带权路径长度WPL最小的二叉树 WPL=路径*权值 Huffman常用于压缩编码,正常传输ABCDEF这些字母需要3位二进制树来描述,但由于一篇文章中ABCDEF这些字母出现的概 ...

  7. 构造数列Huffman树总耗费_蓝桥杯

    快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...

  8. NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树

    抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: ...

  9. 【数据结构】Huffman树

    参照书上写的Huffman树的代码 结构用的是线性存储的结构 不是二叉链表 里面要用到查找最小和第二小 理论上锦标赛法比较好 但是实现好麻烦啊 考虑到数据量不是很大 就直接用比较笨的先找最小 去掉最小 ...

  10. Huffman树的编码译码

    上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...

随机推荐

  1. 使用 npm 安装 Vue

    使用 npm 安装 Vue 需要 node.js 就不多说了(从 nodejs.org 中下载 nodejs ) (1)安装 Vue,在 cmd 里直接输入: npm install -g cnpm ...

  2. post字符 特殊字符处理【转】

    今天和同事调试接口,由于产品设计的问题,传递的参数没有做任何的限制.同事就在传参数的时候加了些特殊字符到后台,但是后台打印的日志是 null... 然后上网搜了下解决办法:转 https://www. ...

  3. 4.Bootstrap基础总结

    一.Bootstrap 网格系统 二.Bootstrap 排版 三.Bootstrap 代码 四.Bootstrap 表格 五.Bootstrap 表单 六.Bootstrap 按钮 七.Bootst ...

  4. Redis(一):centos下安装。

    yum install gcc-cc++ wget http://download.redis.io/releases/redis-4.0.2.tar.gz .tar.gz /usr/local cd ...

  5. MVC框架以及实例

    MVC框架 MVC(model,view,controller),一种将业务逻辑.数据.界面分离的方法组织代码的框架.在改进界面及用户交互的同时,不需要重写业务逻辑.MVC将传统的输入.处理和输出分离 ...

  6. DOM介绍

    什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节点组成的. 解析过程 ...

  7. 【Leetcode】【Easy】Contains Duplicate

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  8. Andriod(3)——Understanding Android Resources

    Now, we will follow that introduction with an in-depth look at Android SDK fundamentals and cover re ...

  9. Android studio ocr初级app开发问题汇总(含工程代码)

    博客第一篇文章,稍作修改,增加文字介绍 开发目的 最近由于某些需求,需要在Android手机端实现OCR功能,大致为通过手机照相,识别出相片中的中文信息字段.但是由于新手光环+流程不熟悉,遇到了各种各 ...

  10. [T-ARA][Day by Day]

    歌词来源:http://music.163.com/#/song?id=22704409 作曲 : 金泰贤/赵英秀 [作曲 : 金泰贤/赵英秀] [作曲 : 金泰贤/赵英秀] 作词 : 金泰贤/赵英秀 ...