`
文昌平蓝杰
  • 浏览: 56168 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

如何构造哈夫曼树

阅读更多

 

树:

1.概念

   树其实只是含有多个指针域的链表,一个结点可以指向多个子结点,其形状如树一样开支散叶,所以称之为树。其结构与链表基本一样,操作也相似。

 

2.哈夫曼树:

  哈夫曼树是一种带全路径最短的树,因此在信息检索中很有用。

  1.建造哈夫曼树;

哈夫曼树是带权值组成结点组成的,所以结点属性应当有属性

public class Node {

		//要存储的数据
		private String data;
		//在文件中出现的次数
		private int count =0;
		//用来做生在父类的左子树,或者右子树的标识,如果是做左子树为0;右子树为1。
		private String symbol ="" ;
		//节点的父节点
		private Node leftchild;
		//节点的孩子节点
		private Node rightchild;
	}
 

哈夫曼树是由一个结点数据出现次数来建造树的,所以所有的结点应当事先准备好,储存于队列之中,排好序。这个可以用优先队列来实现功能,也可以自己写一个自定义队列来实现。

public void creatTree(Queue q){

		//当队列的的长度大于一时,始终前两个结点相连起来,构建树
		while(q.size()>1){
			Node node1 = q.getNode();//取出第一个结点
			Node node2 = q.getNode();//取出第二个结点
			//构建父节点
			Node node = new Node(" ",node1.getCount()+node2.getCount());
			//建立结点树
			node.setLeftchild(node1);
			node1.setSymbol("0");
			node.setRightchild(node2);
			node2.setSymbol("1");
			//将新生成的父结点加入队列中
			q.add(node);
		}
		this.root = q.getNode();
	}
 

这个队列是我自己写的一个队列,当你取出这个元素时,元素就被移除,添加元素时,自动根据count大小,找到位置排列。

  这样一颗哈夫曼树就被建造起来,再遍历获得哈夫曼编码,就ok了,

public Queue ergodic(Node node,String str) {
		
		// 设计指针 并指向头结点
		Node temp = new Node("指针",0);
		temp = node;
		// 设置出口
		if (null==temp.getLeftchild() && null==temp.getRightchild() ) {
			temp.setSymbol(str);
			q.add(temp);
		}
		else{
			ergodic(node.getLeftchild(),str+"0");
			ergodic(node.getRightchild(), str+"1");
		}
		return q;
	}
 

这样就获取了,就给每一个结点设置了哈夫曼编码,并已将所有有用的结点储存到了队列中。这其实就实现了将文件头压缩时文件编码

的信息存入了队列。哈夫曼就算完成了。

 

分享到:
评论

相关推荐

    构造哈夫曼树,并生成编码

    ### 构造哈夫曼树并生成编码 #### 哈夫曼树简介 哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,在数据压缩、编码等领域有广泛的应用。哈夫曼树的构建过程是通过将权值较小的两个节点...

    构造哈夫曼树的过程

    首先,构造哈夫曼树的初始步骤是**构成初始集合**。给定一组权值,比如{(7, 9, 2, 6, 32, 3, 21, 10)},我们为每个权值创建一棵单节点二叉树,节点即为该权值,左右子树均为空。这些树按照权值的升序排列形成集合F,...

    根据给定的n个权值构造哈夫曼树。通过遍历此二叉树完成哈夫曼编码。

    构建哈夫曼树的基本思想是利用给定的权值集合构造一棵二叉树,使得树中叶子节点的权值代表原始数据中的某个元素出现的频率,整棵树的带权路径长度(Weighted Path Length, WPL)最小。 按照题目描述,哈夫曼树的...

    数据结构实验实现中序线索化二叉树构造哈夫曼树.doc

    数据结构实验实现中序线索化二叉树构造哈夫曼树 本实验报告的主要内容是实现中序线索化二叉树构造哈夫曼树,通过实验实现了解二叉树的基本概念和哈夫曼树的构造过程。 一、实验背景 二叉树是数据结构中的一种重要...

    构造哈夫曼树并求哈夫曼编码的算法实现.doc

    "构造哈夫曼树并求哈夫曼编码的算法实现" 哈夫曼树是一种特殊的二叉树,它的每个叶子节点都对应着一个权值,哈夫曼编码是基于哈夫曼树的编码方式。哈夫曼树的构造和哈夫曼编码的实现是信息论和编程领域中的经典问题...

    C语言构造哈夫曼树.rar

    给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

    C++ 构造哈夫曼树(非常棒的哦)

    通过运行这个程序,我们可以观察到哈夫曼树的构造过程,并使用它对特定数据进行编码和解码,验证其正确性和效率。 哈夫曼树的特性使得它在数据压缩中具有优越性,因为频繁出现的元素会被赋予更短的编码,减少了总的...

    实现哈夫曼编码,构造哈夫曼树C语言.zip

    哈夫曼编码实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip

    hafumanshu.rar_构造哈夫曼树

    构造哈夫曼树的过程通常分为以下几步: 1. **收集频率信息**:首先,统计每个字符在文本中出现的频率,这些频率就是叶子节点的权值。 2. **构建初始树**:将每个字符作为一个具有权值的叶子节点,用单节点的二叉树...

    构造哈夫曼树C++代码实现

    ### 构造哈夫曼树C++代码实现 #### 哈夫曼树简介 哈夫曼树(Huffman Tree)又称最优二叉树,是一种带权路径长度最短的二叉树,或者说其带权路径长度是最小的。在数据压缩、编码等领域有着广泛的应用。哈夫曼树的...

    实现哈夫曼编码,构造哈夫曼树.zip

    哈夫曼树实现哈夫曼编码,构造哈夫曼树.zip

    基于 C实现哈夫曼编码,构造哈夫曼树

    在C语言中实现哈夫曼编码和构造哈夫曼树涉及以下几个关键步骤: 1. **哈夫曼树的创建**: - 首先,我们需要一个数据结构来存储每个字符及其频率。这通常是一个结构体,包含字符和频率两个字段。 - 接着,创建一个...

    构建哈夫曼树(可构造哈夫曼编码)

    给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短...使用数组构建哈夫曼树,并可用该树构造哈夫曼编码。

    构造哈夫曼树及哈夫曼编码.docx

    在详细设计部分,首先输入叶节点的权值,然后构造哈夫曼树,最后计算并输出每个叶节点的哈夫曼编码。 哈夫曼编码的应用广泛,例如在文本压缩中,可以显著减少数据的存储和传输需求。此外,它也被应用于错误检测和...

    良心出品构造哈夫曼树及哈夫曼编码.pdf

    `HuffmanTree`函数用于构造哈夫曼树,它首先初始化了一个节点数组,然后输入各个节点的权重,并通过循环不断合并最小权重的节点。`HaffmanCode`函数负责生成哈夫曼编码,它遍历哈夫曼树,根据节点的位置(左孩子或右...

    构造哈夫曼树的算法模拟

    构造哈夫曼树的算法模拟。数据结构有个重要的算法。共同学习

    C语言哈夫曼编码,压缩率,构造哈夫曼树

    运行`C语言版本哈夫曼编码构造哈夫曼树`程序,你可以看到实际的压缩效果和哈夫曼树的结构。 总的来说,掌握哈夫曼编码的原理和C语言实现可以帮助你理解和应用数据压缩技术,特别是在处理大量文本数据时,能够有效地...

    构造哈夫曼树过程.swf

    构造哈夫曼树过程.swf

    数据结构哈夫曼树PPT学习教案.pptx

    构造哈夫曼树需要将权值大的结点靠近根,以使二叉树的 WPL 最小。 例如,有 4 个结点,权值分别为 7、5、2、4,构造有 4 个叶子结点的二叉树,计算 WPL 可以得到: WPL = 7*2 + 5*2 + 2*2 + 4*2 = 36 要使二叉树 ...

Global site tag (gtag.js) - Google Analytics