终于把哈夫曼树及哈弗曼编码弄好了~
哈夫曼树就是最优二叉树
和上次的搜索二叉树一样,哈夫曼树也有它特定的构造规则:
1.要把要存入哈夫曼树的数据分别创建一个树
2.把这些树按照大小顺序排序(在Java里面用优先队列PriorityQueue非常方便)
3.去两个最小的树,把他们合并在一块儿,并把合并后的树放回队列,如此递归往复……
4.把最后剩下的那个树设置为根节点。
这样,哈夫曼树就构造完成了~
检查方法就是把哈夫曼树的所有叶结点的编码都输出来,向左走编码为0,向右走编码为1(根据自己规定)
然后再根据编码把树画出来,检查~
首先是节点类:
/**
* 哈夫曼树节点类
* @author Micro
*
*/
public class HafNode implements Comparable<HafNode>{
private HafNode father;
private HafNode left;
private HafNode right;
private int num;
//重载构造器
public HafNode (int num) {
this.num=num;
}
public HafNode getFather() {
return father;
}
public void setFather(HafNode father) {
this.father = father;
}
public HafNode getLeft() {
return left;
}
public void setLeft(HafNode left) {
this.left = left;
}
public HafNode getRight() {
return right;
}
public void setRight(HafNode right) {
this.right = right;
}
public int getNum() {
return num;
}
public void setNum(int i) {
this.num = i;
}
//设置要比较的对象
@Override
public int compareTo(HafNode o) {
// 要比较的是数字大小
int P = o.getNum();
return num-P;
}
}
然后就是建树过程和输出哈弗曼编码:
import java.util.PriorityQueue;
/**
* 创建哈夫曼树并获得各叶节点的哈弗曼编码
*
* @author Micro
*
*/
public class HafTest {
// 创建根节点
private static HafNode root;
// 程序入口
public static void main(String[] args) {
// 创建一个数组
int[] a = { 1, 4, 3, 5, 6 ,4,6,7,6};
// 创建优先队列
PriorityQueue<HafNode> queue = new PriorityQueue<HafNode>();
HafTest ht = new HafTest();
// 把每个数新建一个节点
for (int i = 0; i < a.length; i++) {
HafNode hf = new HafNode(a[i]);
queue.add(hf);
}
ht.HafTree(queue);
String Code = "";
ht.print(root, Code);
}
// 创建哈夫曼树
public void HafTree(PriorityQueue<HafNode> queue) {
while (queue.size() > 1) {
HafNode min1, min2;
min1 = queue.poll();
min2 = queue.poll();
// 创建合并的节点
HafNode result = new HafNode(min1.getNum() + min2.getNum());
result.setLeft(min1);
result.setRight(min2);
min1.setFather(result);
min2.setFather(result);
queue.add(result);
}
root = queue.peek();
}
// 打印叶节点
public void print(HafNode a, String Code) {
if (a.getLeft() == null && a.getRight() == null) {
System.out.println(a.getNum() + "的哈夫曼编码为:" + Code);
}
if (a.getLeft() != null) {
print(a.getLeft(), Code + '0');
}
if (a.getRight() != null) {
print(a.getRight(), Code + '1');
}
}
}
输出的结果为:
4的哈夫曼编码为:000
1的哈夫曼编码为:0010
3的哈夫曼编码为:0011
4的哈夫曼编码为:010
5的哈夫曼编码为:011
6的哈夫曼编码为:100
6的哈夫曼编码为:101
6的哈夫曼编码为:110
7的哈夫曼编码为:111
恩~~没有错误~~
这样,一个最基本的哈夫曼树就完成了,下面就是利用这个树实现文件的压缩~加油~~~
分享到:
相关推荐
总的来说,哈夫曼树与哈夫曼编码是数据压缩技术的基础,它们利用了数据的统计特性来提高压缩效率,是计算机科学中不可或缺的一部分。通过学习和掌握这一技术,我们可以更好地理解和设计高效的压缩算法,优化数据存储...
哈夫曼树及哈弗曼编码讲解,适合考研的同学或者初学数据结构得到同学
哈夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。用c++实现构造哈夫曼树、哈夫曼编码。
哈夫曼树及哈夫曼编码译码的实现 哈夫曼树是一种特殊的二叉树,它的每个节点的权重是其所有子节点的权重之和。哈夫曼树的应用非常广泛,如数据压缩、编码、译码等。 哈夫曼树的存储结构 哈夫曼树的存储结构可以...
哈夫曼树是一种特殊的二叉树,用于解决数据编码和压缩问题,特别是在数据通信和文件压缩领域广泛应用。哈夫曼编码是一种高效的前缀编码方法,它根据数据出现频率分配最短的二进制码,频繁出现的字符拥有较短的编码,...
从文件中读取字符串,统计字符次数,构建哈夫曼树,输出编码。河北联合大学。。哈哈
哈夫曼编解码器 问题描述:使用哈夫曼编码,实现文本文件的编码和解码,具体要求如下: ① 文本文件 data.txt 中仅包含 ASCII 字符,总字符数不少于 ... 涉及算法及知识:哈夫曼树、哈弗曼编码、文本文件读写 API。
总的来说,哈夫曼树与哈夫曼编码是计算机科学中的重要工具,它们利用权重分配优化了编码效率,从而在许多场景下提高了系统性能。理解并掌握这一技术对于深入学习数据结构和算法,以及在实际项目中解决问题具有重要的...
哈夫曼树(Huffman Tree)...总的来说,哈夫曼编码和哈夫曼树是数据结构和算法课程中的经典内容,同时也是实际应用中解决数据压缩问题的有效工具。通过C++实现这些算法,有助于理解其工作原理,并能应用于实际项目中。
总结来说,哈夫曼编码是一种基于二叉树的编码方法,通过构建哈夫曼树并对其进行深度优先遍历,为字符生成优化的二进制编码,从而达到数据压缩的目的。在信息技术领域,哈夫曼编码是不可或缺的工具之一,尤其在数据...
总的来说,这个实验旨在通过编程实现哈夫曼编码的过程,包括哈夫曼树的构造、编码的生成以及对报文的编码操作,以提高通信效率和降低成本。通过这个实验,学生可以深入理解哈夫曼编码的工作原理和实际应用。
哈夫曼树是一种特殊的二叉树,常用于数据压缩和编码,通过构建最小带权路径长度的二叉树,使得频率高的字符编码长度较短,从而提高数据传输效率。 课程设计的主要任务包括: 1. 建立哈夫曼树:从用户输入的字符集和...
总的来说,哈夫曼树和哈夫曼编码是计算机科学中一种重要的数据结构和算法,它们为无损数据压缩提供了有效的解决方案。通过理解和实现哈夫曼树与哈夫曼编码,我们可以深入理解数据压缩的原理,并能设计出更高效的压缩...
在C语言中实现哈夫曼树主要用于数据的编码和解码,特别是压缩数据时,能够有效地提高编码效率。下面将详细介绍哈夫曼树的概念、构建过程以及如何输出对应的哈夫曼编码。 1. **哈夫曼树概念**: 哈夫曼树是一种带...
"哈夫曼树和哈夫曼编码的实现" 哈夫曼树是一种高效的编码树结构,它广泛应用于数据压缩、编码等领域。哈夫曼编码是一种变长前缀编码方法,它可以将符号编码成二进制代码,以达到压缩数据的目的。 哈夫曼树的构建...