`
大_圣
  • 浏览: 17164 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

哈夫曼树(最优二叉树)

 
阅读更多

....差点忘记写博客了...

 

 

哈夫曼树 .. 其实就是只利用叶子结点来存储要用信息的树,只不过它在构造的时候就拥有了一个迷人的特性... 就是WPL(带权路径长度)是最小的.. 而且还能用这个树的来为叶子结点中的信息进行编码, 得出来的各个编码一定不会相同,并且不会产生混淆的情况..

 

通过哈夫曼树的特点.实现了根据一个队列来创建一棵哈夫曼树的方法.

/**
	 * 得到随机产生的队列
	 */
	public void setQueue() {
		Random rd = new Random();
		System.out.println("随机产生的队列为:");
		for (int i = 0; i < 10; i++) {
			int k = rd.nextInt(20);
			TreeNode tn = new TreeNode(k);
			queue.add(tn);
			System.out.print(k + " ");
		}
		System.out.println();
	}

	// 得到队列
	public PriorityQueue<TreeNode> getQueue() {
		return queue;
	}

	// 建树,while (queue.size()>=2)
	public TreeNode CreatTree(PriorityQueue<TreeNode> queue) {
		TreeNode lc = queue.poll();
		TreeNode rc = queue.poll();
		// 两个最小的结点通过这个结点连接起来
		TreeNode tr = new TreeNode((Integer) lc.getData()
				+ (Integer) rc.getData());
		tr.setLchild(lc);
		tr.setRchild(rc);
		lc.setParent(tr);
		rc.setParent(tr);
		// 将其父结点放入队列.
		queue.add(tr);
		return tr;// 将根结点返回.当返回到最后一个根结点时就构成了一棵树
	}

 到此.. 哈夫曼树就建成了. 接下来就是哈夫曼编码了.这个的实现我用到了递归,并且是每个叶结点往回找

 

/**
	 * 为每个叶结点编码,返回字符串
	 * 
	 * @param leaf每次传入一个叶结点
	 * @return以字符串形式返回每个叶结点的哈夫曼编码
	 */
	public String ToCode(TreeNode leaf) {
		String s = "";
		// 叶结点存在双亲结点.
		if (leaf.getParent() != null) {
			if (leaf.getParent().getLchild() == leaf) {
				// 向父结点递归
				s = ToCode(leaf.getParent()) + 0;
				return s;// 叶结点为左孩子时,在递归得到的编码后面加个0;
			} else if (leaf.getParent().getRchild() == leaf) {
				// 向父结点递归
				s = ToCode(leaf.getParent()) + 1;
				return s;// 叶结点为右孩子时,在递归得到的编码后面加个1;
			}
		}
		return s;
	}

 

 通过这个方法.. 实现对哈夫曼树中叶子结点进行哈夫曼编码的

 

 

 

补充个.. 今天读取文件中的字节时..发现0出现的次数是最多的 ... 读了个162M的文件.. 0的个数比其他的数出现的次数多了10万次 ....
 

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

相关推荐

    哈夫曼算法最优二叉树.cpp

    定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。

    Huffman编码树最优二叉树

    哈夫曼二叉树编码译码器 里面有课程设计报告 课程是数据结构

    哈夫曼树 哈夫曼编码

    哈夫曼树 哈夫曼编码 最优二叉树 判定问题

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

    哈夫曼树是最优二叉树的另一种说法。本程序测试已通过。而且还有范例。供广大学子学习非常棒哦。

    最优二叉树——哈夫曼树.doc

    树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前趋。

    数据结构 C++ 建立哈夫曼树

    任务 :建立建立最优二叉树函数 要求:可以建立函数输入二叉树,并输出其赫夫曼树 在上交资料中请写明:存储结构、 基本算法(可以使用程序流程图) 、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外...

    哈夫曼树的介绍.pdf

    当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。 在构建哈弗曼树时,要使树的带权路径...

    哈夫曼树及其的应用(数据结构试验)

    1.在二叉树基本操作的基础上,掌握对二叉树的一些其它操作的具体实现方法。 2.掌握构造哈夫曼树以及哈夫曼编码的方法。 3、熟练掌握哈夫曼树(最优二叉树)特征及其应用

    java哈夫曼树数据结构.docx

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

    哈夫曼树与哈夫曼编码.txt

    哈夫曼树,也被称为最优二叉树,是一种特殊的二叉树结构。它的定义是:在n个带权叶子结点的二叉树中,带权路径长度最小的二叉树。带权路径长度指的是从树根结点到任意结点的路径长度(经过的边数)与该结点上权值的...

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

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

    哈夫曼树&哈弗曼编码

    哈夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。用c++实现构造哈夫曼树、哈夫曼编码。

    哈夫曼树的编码与译码

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

    解析C++哈夫曼树编码和译码的实现

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

    HuffmanTree(最优二叉树)

    NULL 博文链接:https://sunshineminyan.iteye.com/blog/1921103

    C语言构造哈夫曼树.rar

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

    哈夫曼树(c语言)

    用C语言实现哈夫曼树,给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较...

    哈夫曼树应用STL栈的C++语言构建

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

    头歌数据结构构建哈夫曼树及编码

    头歌数据结构构建哈夫曼树及编码 第1关构建哈夫曼树 ...第一关:根据字符个数及字符出现的频率,构造带权路径最短的最优二叉树(哈夫曼树); 第二关:根据构建好的哈夫曼树构造字符的前缀编码(哈夫曼编码)。

    C++数据结构与算法之哈夫曼树的实现方法

    哈夫曼树又称最优二叉树,是一类带权路径长度最短的树。 对于最优二叉树,权值越大的结点越接近树的根结点,权值越小的结点越远离树的根结点。 前面一篇图文详解JAVA实现哈夫曼树对哈夫曼树的原理与java实现方法做了...

Global site tag (gtag.js) - Google Analytics