....差点忘记写博客了...
哈夫曼树 .. 其实就是只利用叶子结点来存储要用信息的树,只不过它在构造的时候就拥有了一个迷人的特性... 就是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
分享到:
相关推荐
定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。
哈夫曼二叉树编码译码器 里面有课程设计报告 课程是数据结构
哈夫曼树 哈夫曼编码 最优二叉树 判定问题
哈夫曼树是最优二叉树的另一种说法。本程序测试已通过。而且还有范例。供广大学子学习非常棒哦。
树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前趋。
任务 :建立建立最优二叉树函数 要求:可以建立函数输入二叉树,并输出其赫夫曼树 在上交资料中请写明:存储结构、 基本算法(可以使用程序流程图) 、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外...
当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。 在构建哈弗曼树时,要使树的带权路径...
1.在二叉树基本操作的基础上,掌握对二叉树的一些其它操作的具体实现方法。 2.掌握构造哈夫曼树以及哈夫曼编码的方法。 3、熟练掌握哈夫曼树(最优二叉树)特征及其应用
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree) 赫夫曼树是 带权路径长度最短的树 ,权值较大的结点离根较近。 树...
哈夫曼树,也被称为最优二叉树,是一种特殊的二叉树结构。它的定义是:在n个带权叶子结点的二叉树中,带权路径长度最小的二叉树。带权路径长度指的是从树根结点到任意结点的路径长度(经过的边数)与该结点上权值的...
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。使用数组构建哈夫曼...
哈夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。用c++实现构造哈夫曼树、哈夫曼编码。
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 二.实现步骤: 1....
NULL 博文链接:https://sunshineminyan.iteye.com/blog/1921103
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
用C语言实现哈夫曼树,给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较...
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。本资源通过...
头歌数据结构构建哈夫曼树及编码 第1关构建哈夫曼树 ...第一关:根据字符个数及字符出现的频率,构造带权路径最短的最优二叉树(哈夫曼树); 第二关:根据构建好的哈夫曼树构造字符的前缀编码(哈夫曼编码)。
哈夫曼树又称最优二叉树,是一类带权路径长度最短的树。 对于最优二叉树,权值越大的结点越接近树的根结点,权值越小的结点越远离树的根结点。 前面一篇图文详解JAVA实现哈夫曼树对哈夫曼树的原理与java实现方法做了...