什么是哈弗曼树

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

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

应用场景

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

建立哈弗曼树

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

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. Sql Server 2012 Local DB发布到服务器端后无法访问

    背景 基于Windows认证的Web application, 通过Visual Studio 2013创建的LocalDB位于App_Data目录下 现象 本地调试没有任何问题.发布到服务器(Win ...

  2. method invocation

    package method.invocation; public class MethodInvocation { public static void main(String[] args) { ...

  3. 网页简单布局之结构与表现原则(HTML/CSS)

    结构 样式 行为真正的分离 前端初级人员会在页面上单纯的用各个div把相关内容独立开: 前端中级人员明白相关属性的设置会给元素带来什么改变,从而减少div的书写: 前端高级人员会以及其简单的和稳定的方 ...

  4. 在AndroidStudio中数据存储第三方数据管理Bmob的使用

    ---恢复内容开始--- 在日常写代码的过程中我们比较痛苦的就是数据库的建立和使用,那么今天来介绍一下一个第三方的数据管理平台Bmonb. 一.我们首先进入Bmob的官网创建一个账号 Bome官网网址 ...

  5. Java学习---常见的模式

    Java的常见模式 适配器模式 package com.huawei; import java.io.BufferedReader; import java.io.IOException; impor ...

  6. December 06th 2016 Week 50th Tuesday

    Behind every beautiful thing, there is some kind of pain. 美丽背后,必有努力. No pains, no gains. But it seem ...

  7. FZU-1608 Huge Mission 线段树(更新懒惰标记)

    题目链接: https://cn.vjudge.net/problem/FZU-1608 题目大意: 长度n,m次操作:每次操作都有三个数:a,b,c:意味着(a,b]区间单位长度的价值为c,若某段长 ...

  8. contOS 网络配置

    设定VirtualBox虚拟网卡的IP地址(现在设定本地机器网卡IP 192.168.56.1  子网掩码255.255.255.0) 设置虚拟机中的网络设置 在虚拟机中选用host-only网络(注 ...

  9. webkit架构

    简要的说,WebKit由三个模块组成:JavaScriptCore.WebCore 和 WebKit.WebKit作为了整个项目的名称. JavaScriptCore:是JavaScript解释器: ...

  10. BZOJ2330:[SCOI2011]糖果(差分约束)

    Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...