`

简单哈夫曼树

 
阅读更多

一、基本概念

1. 哈夫曼树即最优二叉树,是只有叶节点才能存放数据,且使所有数据到根节点的距离与
  其权值乘积和最小的二叉树。
 

  2.建立哈夫曼树的步骤:
     step1.从所有数据中找到权值最小的两个数据A和B,把A和B作为两个子节点,建立
     一个二叉树,设它们的父节点为C,C的权值是A和B权值的和。
     step2.在原来的所有数据中用C替换A和B,重复step1。
     step3.直到只剩下一个数据时哈夫曼树完成。

    
二、用程序获得哈夫曼树
1.建立结点类
         哈夫曼树中的结点包括数据权值(int型)、左侧子结点(结点型)、右侧子结点(结点型)
对于按字符串中字符出现次数画哈夫曼树,结点基本包括以下几个属性(字符、权值、左结点、右结点)

 private char c;
	private int weight;
	private HfmNode left;
	private HfmNode right;

2.把权值形成的数组转化为结点组成的数组(如果是在一个字符串中,以每个字符出现的次数作为权值建立哈夫曼树,需要新建一个字符串用于存储出现的字符并计算每个字符的权值)
 private String content;//the original string
	private String simContent;//the simplified string which consists of the 
	                          //letter content does but every letter just 
	                          //appears once
	private static HfmNode[] nodes;//the array saving the nodes
/**
	 * traverse the content,use the letter that content consists of to create a
	 * new string simContent,and in simContent does every letter just appear once
	 */
	public void simplifyContent(){
		simContent="";
		for(int i=0;i<content.length();i++){
			char letter=content.charAt(i);
			if(simContent.indexOf(letter)==-1){
				simContent+=letter;
				
			}
		}
	}
	/**
	 * use the letter simContent consists of to create a array
	 */
	public void toCharArray(){
		nodes=new HfmNode[simContent.length()];
		for(int i=0;i<simContent.length();i++){
			char letter=simContent.charAt(i);
			HfmNode node=new HfmNode(letter);
			nodes[i]=node;
		}
	}
	/**
	 * count the frequency every letter in simContent appears,and set the 
	 * weight of each HfmNode in nodes[]
	 */
	public void countLetter(){
		for(int i=0;i<simContent.length();i++){
			int count=0;
			char letter1=simContent.charAt(i);
			for(int j=0;j<content.length();j++){
				char letter2=content.charAt(j);
				if(letter1==letter2)
					count++;
			}
			nodes[i].setWeight(count);
		}
	}

3.用结点型数组建立哈夫曼树,建立过程中,每次选择权值最小的两个数据时都要进行排序
/**
	 * sort the elements in nodes[] according to the value of each HfmNode's
	 * weight 
	 */
	public void sortNodeWeight(){
		for(int i=0;i<nodes.length;i++){
			for(int j=i+1;j<nodes.length;j++){
				if(nodes[i].getWeight()>nodes[j].getWeight()){
					HfmNode tem=new HfmNode();
					tem=nodes[i];
					nodes[i]=nodes[j];
					nodes[j]=tem;
				}
			}
		}
	}
	
	/**
	 * create a tree
	 * step1.find the two smallest weights,make their node as the sub-nodes,
	 * then build a binary tree ,the weight of this binary tree's root is the 
	 * sum of the two smallest weights' values
	 * step2.the root of this new binary tree takes place of the two former
	 * nodes,regard the root as a member of nodes[],then repeat step1 until 
	 * there is only one node in nodes[]
	 */
	public HfmNode createHfmTree(){
		while(nodes.length>1){
			this.sortNodeWeight();
			HfmNode root=new HfmNode(nodes[0].getWeight()+nodes[1].getWeight());
			root.setLeft(nodes[0]);
			root.setRight(nodes[1]);
			
			HfmNode[] newNodes=new HfmNode[nodes.length-1];
			newNodes[0]=root;
			for(int i=0;i<nodes.length-2;i++){
				newNodes[i+1]=nodes[i+2];
			}
			nodes=newNodes;
		}
		return nodes[0];
	}

4.打印出每个数据的哈夫曼编码
/**
	 * traverse the HfmTree and print the code of every node
	 * @param n:parent node
	 * @param code:HfmCode
	 */
	public void printHfmTreeCode(HfmNode n,String code){
		if(n.getLeft()==null&&n.getRight()==null){
			System.out.println("the weight of "+n.getC()+" is "+
		n.getWeight()+",and its HfmCode is "+code);
		}else 
			if(n.getLeft()!=null){
				printHfmTreeCode(n.getLeft(),code+"0");
			}
		    if(n.getRight()!=null){
			    printHfmTreeCode(n.getRight(),code+"1");
		    }
	}
	

5.打印出哈夫曼树图形
哈夫曼图形绘出的方法和打印编码的方法类似,最终可以得到下图所示的哈弗曼图形

  • 大小: 26.8 KB
分享到:
评论

相关推荐

    C语言实现哈夫曼树的构建

    构建哈夫曼树的算法步骤可以分为几个关键点:首先,初始化权值数组和指针数组,这些数组将用于存储每个字符的频率以及对应的哈夫曼树节点。接着,需要不断遍历权值数组,找出最小的两个权值,并将它们合并成一个新的...

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

    在IT领域,哈夫曼树(Huffman Tree)是一种特殊的数据结构,主要用于数据编码和压缩,以实现高效的信息传输和存储。哈夫曼编码是一种基于哈夫曼树的变长编码方法,它能够对出现频率高的字符赋予较短的编码,从而在...

    简单的哈夫曼树程序 简单的哈夫曼树程序

    编写的一个简单的哈夫曼树程序,要建立相应的文本文档,因为采用了文件操作的方法,但是稍微修改就可以应用在其他文件的压缩.

    哈夫曼树课程设计报告与代码

    哈夫曼树是一种特殊的二叉树,用于解决数据编码和压缩问题,特别是在计算机科学和信息处理领域具有广泛应用。本课程设计报告与代码专注于利用C++实现哈夫曼树的构建和应用,结合Easy-X库来可视化哈夫曼树,使得理解...

    哈夫曼树简单应用

    哈夫曼树(Huffman Tree),也称为最优二叉树,是数据压缩领域中的一个重要概念。它是基于贪心策略构建的一种特殊的二叉树结构,用于实现哈夫曼编码,这是一种高效的前缀编码方法。在哈夫曼树中,频率较高的字符对应...

    哈夫曼树的相关程序,试验

    根据给定的文件信息,我们可以总结出以下关于哈夫曼树及其实现的关键知识点: ### 哈夫曼树的基本概念 哈夫曼树是一种特殊的二叉树,它被广泛应用于数据压缩领域,特别是用于构建高效的编码系统。哈夫曼树能够通过...

    哈夫曼树实现压缩解压

    ### 哈夫曼树实现压缩解压 #### 概述 哈夫曼树是一种用于数据压缩的二叉树结构,常被应用于无损压缩算法中。本文将深入解析一个利用哈夫曼树进行文件压缩与解压的具体实现案例。本程序通过C语言编写,并在VC++6.0...

    哈夫曼树的应用(哈夫曼树的建立,编码,解码)

    通过以上介绍,我们可以看到哈夫曼树不仅构造简单,而且应用广泛,尤其是在数据压缩领域。无论是哈夫曼树的构建还是编码、解码的过程,都需要对树的结构有深刻的理解。此外,哈夫曼编码由于其高效性,在实际应用中...

    哈夫曼树链式存储及简单哈夫曼编码VB实现

    在`哈夫曼树链式存储及简单哈夫曼编码.doc`文件中,可能包含了详细的理论介绍和VB代码实现。`HuffTree`可能是实现哈夫曼树的VB代码模块或类库,而`finalExe`则是编译后的可执行程序,用户可以通过运行这个程序来实际...

    基于哈夫曼树的压缩软件 c++

    在构建哈夫曼树时,需要统计字符频次,如果采用简单的遍历算法,时间复杂度为 O(n²),并不理想。因此,可以创建一个结构体数组 count1[256],其中有两个数据:char data,int weight 分别来记录数据和结构。这样...

    哈夫曼树数据结构报告

    《哈夫曼树数据结构报告》是一份关于利用哈夫曼编码进行通信的课程设计报告。这份报告的主要目的是让学生通过编程实践,掌握哈夫曼树的构建和应用,以提高信道利用率,减少信息传输时间和成本。哈夫曼编码是一种前缀...

    c语言编写哈夫曼树

    哈夫曼树,又称最优二叉树或最小带权路径长度树,是数据结构中一种特殊的二叉树,主要用于数据的编码压缩。在C语言中实现哈夫曼树,可以帮助初学者深入理解数据结构和算法,特别是对于压缩和编码的概念。下面我们将...

    哈夫曼树c++语言编写

    ### 哈夫曼树C++语言编写 #### 概述 哈夫曼树是一种带权路径长度最短的二叉树,也被称为最优二叉树。在编码领域有着广泛的应用,例如数据压缩中的哈夫曼编码。本篇文章将基于提供的代码片段,详细解释哈夫曼树的...

    哈夫曼树建立及编码,可在VC++6.0上运行

    本代码示例展示了如何在VC++6.0环境中构建哈夫曼树以及进行简单的编码处理。代码主要包括以下几个部分: 1. **头文件包含**:`#include&lt;stdio.h&gt;`用于输入输出操作;`#include&lt;conio.h&gt;`提供控制台输入输出功能;`#...

    哈夫曼树(C语言描述)

    压缩文件"哈夫曼树"中可能包含了这些函数的实现,以及一个简单的测试用例,用于演示如何使用这些函数构建哈夫曼树并生成编码。理解并掌握哈夫曼树的构建和编码生成对于学习数据结构和算法,尤其是数据压缩领域是非常...

    用Java编写的哈夫曼树代码

    哈夫曼树,又称最优二叉树或最小带权路径长度树,是一种特殊的二叉树结构,主要用于数据的编码和解码,以提高传输效率。在哈夫曼树中,频率较低的字符会被分配较短的编码,而频率较高的字符则会分配较长的编码,以此...

    用c++实现哈夫曼树

    用C++实现简单的哈夫曼树,包括:编码,解码,打印输出哈夫曼树,计算压缩比。

Global site tag (gtag.js) - Google Analytics