`
百合不是茶
  • 浏览: 351863 次
社区版块
存档分类
最新评论

哈夫曼树和编码

阅读更多

 

 

哈夫曼树:所有的叶子节点的加权路径和最小的

 



 

哈夫曼编码:每个叶子节点的编码

 从跟节点到达该叶子节点经历的路径(枝节点)

 左枝节点:0   右枝节点:1

每个叶子节点的路径都可以转成一个01字符串,这个01串就是哈夫曼编码

 

 

 

根据给定的数组创建哈夫曼树和哈夫曼编码:代码如下

 

package com.HuffmanCode;
/**
 * @author Administrator
 * 创建哈夫曼编码的节点类
 */
public class TreeCode {
	
	//属性
	int obj;
	TreeCode LeftChild;
	TreeCode RightChild;
	public TreeCode parent;
	int flag = -1;//根节点为-1,左1,右0
	
	//创建对象时需要的参数
	public TreeCode(int obj){
		this.obj = obj;
	}
	
	//重写toStringde 方法
	public String toString(){
		return String.valueOf(obj);
	}
	

}

 

 

 

package com.HuffmanCode;

import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Set;
/**
 * 创建哈夫曼树,并得到哈夫曼编码
 * 
 * @author Administrator
 * 
 */
public class Huffman {

	public static void main(String[] args) {
		
		Huffman tree = new Huffman();
		// 根据给定的数组创建哈夫曼树
		int array[] = { 1, 3, 2, 4, 5 };

		// 创建队列节点
		PriorityQueue<TreeCode> queueList = tree.creatNode(array);
		// // 遍历队列
		// while (queueList.size() > 0) {
		// System.out.println(queueList.poll());
		// }

		// 根据队列节点创建树
		TreeCode root = tree.creatTreeNode(queueList);
		// 打印输出树
		tree.printTree(root);

		// 创建并输出节点的编码
		HashMap<TreeCode, String> map = tree.creatCode(root);
              //遍历HashMap队列中的哈夫曼编码
		Set<TreeCode> code = map.keySet();
		for (TreeCode s : code) {
			String v = map.get(s);
			System.out.println(s + "<<<>>>>>" + v);
		}

	}

	// 打印树的方法;
	public void printTree(TreeCode root) {
		// 判断节点是否寻在
		if (root != null) {
			// 输出根节点
			System.out.println(root);
			// 输出左节点
			TreeCode left = root.LeftChild;
			printTree(left);
			// 输出右节点
			TreeCode right = root.RightChild;
			printTree(right);

		}
	}

	/**
	 * 创建节点并排序
	 * 
	 * @param array根据数组创建节点
	 * @return 返回队列
	 */
	public PriorityQueue<TreeCode> creatNode(int array[]) {

		PriorityQueue<TreeCode> queueList = new PriorityQueue<TreeCode>(11,
				new Comparator<TreeCode>() {
					// 创建匿名类来重写排序方法
					@Override
					public int compare(TreeCode o1, TreeCode o2) {
						// 返回排序规则
						return o1.obj - o2.obj;
					}

				});

		// 遍历并创建节点
		for (int i = 0; i < array.length; i++) {
			TreeCode code = new TreeCode(array[i]);
			queueList.add(code);
		}

		return queueList;

	}

	/**
	 * 根据节点创建树
	 * 
	 * @param queueList传入的队列
	 * @return 返回树根
	 */
	public TreeCode creatTreeNode(PriorityQueue<TreeCode> queueList) {
		while (queueList.size() > 1) {
			// 去除前两个元素
			TreeCode n1 = queueList.poll();
			TreeCode n2 = queueList.poll();
			// 根据去除最前面的两个数创建新的节点

			TreeCode n3 = new TreeCode(n1.obj + n2.obj);
			// 设置n1,n2,n3之间的关系及位置
			n3.LeftChild = n1;
			n3.RightChild = n2;
			n1.flag = 1;
			n2.flag = 0;

			n1.parent = n3;
			n2.parent = n3;

			// 将根节点放入队列
			queueList.add(n3);
		}

		// 取出根节点
		TreeCode root = queueList.poll();

		// 将根节点放回
		return root;

	}

	/*
	 * 创建HsahMap队列来保存哈夫曼编码
	 */
	public HashMap<TreeCode, String> creatCode(TreeCode root) {

		HashMap<TreeCode, String> map = new HashMap<TreeCode, String>();
		// 调用创建哈夫曼编码的方法
		getTreeCode(root, null, map, "");

		return map;

	}

	/**
	 * 创建哈夫曼编码
	 */
	public void getTreeCode(TreeCode root, TreeCode parent,
			HashMap<TreeCode, String> map, String s) {
		// 节点是否存在
		if (root != null) {
			if (root.flag != -1) {
				s += root.flag;
			}
			// 遍历左边的编码
			TreeCode left = root.LeftChild;
			getTreeCode(left, root, map, s);

			// 遍历右边的编码
			TreeCode right = root.RightChild;
			getTreeCode(right, root, map, s);

		} else {
			map.put(parent, s);
		}

	}

}

 

输出结果:

哈夫曼树:

15

6

3

3

1

2

9

4

5

 

哈夫曼编码:

5<<<>>>>>00

2<<<>>>>>100

1<<<>>>>>101

4<<<>>>>>01

3<<<>>>>>11

上面的哈夫曼图 中的叶子节点 1,2应该在右边的3节点 下面

 

 

 

  • 大小: 52.3 KB
0
0
分享到:
评论

相关推荐

    哈夫曼树和编码应用数据结构课程设计

    哈夫曼树和编码应用数据结构课程设计 任务和功能: (1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树的存储结构; (2)利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对给定的n个...

    哈夫曼树及哈夫曼编码数据结构实验报告

    哈夫曼树是一种特殊的二叉树,用于解决数据编码和压缩问题,特别是在数据通信和文件压缩领域广泛应用。哈夫曼编码是一种高效的前缀编码方法,它根据数据出现频率分配最短的二进制码,频繁出现的字符拥有较短的编码,...

    哈夫曼树及其编码

    在华东交通大学的C++课设中,第八题要求学生深入理解和应用哈夫曼树及哈夫曼编码来实现数据的高效存储和传输。下面我们将详细探讨这两个主题。 哈夫曼树,又称为最优二叉树或最小带权路径长度树,是一种带权路径...

    构建哈夫曼树和编码

    自己写的哈夫曼树还行 各位看官来下载吧 测试无错误

    哈夫曼树与哈夫曼编码

    哈夫曼树与哈夫曼编码是数据结构和算法领域中的一个重要概念,广泛应用于数据压缩、文本编码以及优先队列等场景。哈夫曼编码是一种特殊的前缀编码方法,能够为字符提供一种高效的二进制表示,使得频繁出现的字符具有...

    c++ 源代码 哈夫曼树 哈夫曼编码

    c++ 源代码 哈夫曼树 哈夫曼编码 部分代码如下: #include"Huffman.h" #include"hfmTree.h" #include using namespace std; int main() { cout~~~~~~~~~~~~~welcome to Huffman encodrding&decoding system ~~~~~~...

    哈夫曼树 课程设计 实验报告

    这一过程包括了字符频率统计、哈夫曼树构造、编码和解码四个步骤。 在概要设计阶段,实验被分解为三个主要模块:编码、译码和退出。编码模块负责读取文本文件,统计字符频率,构建哈夫曼树,并对文本进行编码,输出...

    哈夫曼树 哈夫曼编码

    哈夫曼树,又称最优二叉树,是一种特殊的二叉树结构,主要用于数据编码和压缩。它的设计目标是使得带权路径长度(WPL,Weighted Path Length)最小,也就是在树的所有节点中,从根节点到每个叶子节点的路径长度乘以...

    哈夫曼树的编码与译码

    哈夫曼树(Huffman Tree),也称为最优二叉树,是数据...理解哈夫曼树的构建、编码和译码原理,对于理解和设计相关算法具有重要意义。在实际应用中,可以根据具体需求选择合适的哈夫曼编码变种,以达到最优的压缩效果。

    哈夫曼树的编码和解码 +英语文章 全代码

    理解并掌握哈夫曼树的编码和解码原理,以及如何在C++/C#中实现,对于理解和实践数据压缩技术具有重要意义。在实际项目中,结合具体需求,可以灵活应用这些知识来优化编码和解码过程,提高效率。

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

    ### 哈夫曼树建立及编码 #### 一、哈夫曼树简介 哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,在数据压缩编码领域有着广泛的应用。哈夫曼树是由David A. Huffman于1952年提出的,其...

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

    解码的过程相对简单,即根据已有的哈夫曼树和编码字符串,还原出原始数据。 1. **初始化解码指针**:设置指针指向编码字符串的起始位置。 2. **遍历哈夫曼树**:根据编码字符串中的每一位,决定在哈夫曼树中向左...

    哈夫曼树和哈夫曼编码的实现

    "哈夫曼树和哈夫曼编码的实现" 哈夫曼树是一种高效的编码树结构,它广泛应用于数据压缩、编码等领域。哈夫曼编码是一种变长前缀编码方法,它可以将符号编码成二进制代码,以达到压缩数据的目的。 哈夫曼树的构建...

    哈夫曼树和哈夫曼编码的Java实现

    在提供的文件`HUFFMan`中,可能包含了实现这些功能的Java代码,包括哈夫曼树的构建、编码和解码的类和方法。对于初学者来说,理解并动手实现这些代码能够加深对哈夫曼编码算法的理解,同时提升编程技能。通过分析和...

    数据结构实验二哈夫曼树及哈夫曼编码译码的实现

    哈夫曼树及哈夫曼编码译码的实现 哈夫曼树是一种特殊的二叉树,它的每个节点的权重是其所有子节点...通过本实验,我们掌握了哈夫曼树的建立和哈夫曼编码的算法,并了解了哈夫曼树在数据压缩、编码、译码等领域的应用。

    哈夫曼树及其编码 数据结构课程设计 (源代码附实验报告)

    此外,他们可能还讨论了编码和解码的效率分析,以及实际压缩和解压文本的效果。 实验报告可能包含以下几个部分: 1. 引言:介绍哈夫曼树和编码的基本概念,以及实验目的。 2. 算法描述:详细阐述构建哈夫曼树和生成...

    建哈夫曼树 实现哈夫曼编码

    哈夫曼树(Huffman Tree)和哈夫曼编码(Huffman Coding)是数据压缩领域中的基础算法,它们主要用于无损数据压缩。哈夫曼编码是一种可变长度的前缀编码,通过为每个字符分配一个唯一的二进制码,使得出现频率高的...

    Python完成哈夫曼树编码过程及原理详解

    HuffmanCodeDic函数根据构建好的哈夫曼树生成编码表,TransEncode函数和TransDecode函数分别用于将字符串编码和解码。 最终,给出了一个具体的例子,通过一个字符串来演示整个哈夫曼编码的过程。通过实例化TreeNode...

    哈夫曼树编码

    哈夫曼树编码是一种高效的前缀编码方法,广泛应用于数据压缩领域。它的基本思想是根据字符出现的频率来构建一棵特殊...理解并掌握哈夫曼树编码的原理和实现,对于提升文件压缩的效率和优化存储资源的利用具有重要意义。

    哈夫曼树和哈夫曼编码

    哈夫曼树和哈夫曼编码是数据压缩领域的重要工具,通过合理的构建哈夫曼树并生成编码,可以有效地降低数据的存储空间或传输时的数据量。本文不仅详细介绍了哈夫曼树的概念和构建方法,还通过具体的C语言程序实现了...

Global site tag (gtag.js) - Google Analytics