兄弟,你把如下第28行的count++;注释掉,一切问题都可以解决!
自己先琢磨为什么,不懂的再问!
importjava.util.Arrays;
importjava.util.Scanner;
publicclassa2{
publicstaticintn,count=0;
publicstaticinthe[]=newint[n+1];//预定义权值数组
publicstaticvoidHuffman(int[]a){
Arrays.sort(a);//排序
//System.out.println(a.length);
if(a.length==1)//如果长度是1结束递归
{
he[count++]=a[0];
return;
}
if(a.length==2)//如果长度是2结束递归
{
he[count++]=a[0]+a[1];
return;
}
else//长度大于2
{
intb[]=newint[a.length-1];//定义一个新数组,用于保存a
he[count++]=a[0]+a[1];
b[0]=he[--count];//新数组的第一个元素为当前数组的最小的两个数之和
for(inti=1;i<b.length;i++)
{
b[i]=a[i+1];//赋值除第一个元素之外的值
}
//count++;
Huffman(b);//递归
}
}
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
n=Integer.parseInt(sc.nextLine());
Strings[]=sc.nextLine().trim().split("");//输入n个数
intd[]=newint[n];
for(inti=0;i<n;i++)
d[i]=Integer.parseInt(s[i]);//将String转化为int的数组
Huffman(d);//递归调用
intsum=0;
for(inti=0;i<he.length;i++)
sum+=he[i];//求和
System.out.println(sum);
}
}
㈡ 到底什么是哈夫曼树啊,求例子
哈夫曼树是给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
例子:
1、将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
2、 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
3、从森林中删除选取的两棵树,并将新树加入森林;
4、重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
(2)java哈夫曼树实例代码扩展阅读:
按照哈夫曼编码构思程序流程:
1、切割的顺序是从上往下,直至数组中的元素全部出现在叶节点;
2、我们思路正好相反,从数组中找出最小的两个元素作为最下面的叶节点,在向备选数组中存入这两个叶节点的和(这个新的和加入累加运算,这个和也就是所求的最小值的一部分,原因如上图)。
3、以本题为例,备选数组中现有元素为{30,30},再次取出两个最小元素进行求和,得到新的元素,回归备选数组并记入累加。
4、上述2.3布重复执行直至备选数组中只有一个元素,此时累加结束,返回累加值即可
5、求数组中的最小值,可以用小根堆进行提取最为方便;此题用到了贪心的思路,即用相同的策略重复执行,直至我们得到所需的结果。
㈢ 构造以下实例的哈夫曼树 并给出你的哈夫曼字符编码
哈夫曼树构造规则
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止
根据上述得到的图是
(1)
/ \
(0.6) (0.4)
/ \ / \
(0.28) E B G
/ \
(0.11) 0.17
/ \ / \
(0.05) D A H
0/ 1\
C F
根的左边是0,右边是1,得到的哈夫曼字编码是
C: 00000 F:00001 D:0001 A:0010 H:0011 E:01 B:10 G:11
㈣ 我用java构建哈夫曼树的时候报了空指针,代码如下
错误提示 贴出来
㈤ 哈夫曼树编码的应用(Java语言)
1)编写函数实现选择parent为0且权值最小的两个根结点的算法
2)编写函数实现统计字符串中专字符的种类以及属各类字符的个数。
3)编写函数构造赫夫曼树。
4)编写函数实现由赫夫曼树求赫夫曼编码表。
5)编写函数实现将正文转换为相应的编码文件。
6)编写函数实现将编码文件进行译码。
7)编写主控函数,完成本实验的功能。
㈥ Java建立哈夫曼树的问题
看了半天,结果发现你走入死循环了;你找到代码:list.add(i,parentNode);
在这个后面加入一行:break;
表示跳出'//否则进入for循环找到新节点的合适位置加入队列'这个else,重现开始查找组装下一个哈夫曼节点
㈦ 用java实现哈夫曼编码
只要自己再加个类Tree就可以了。
代码如下:
public class Tree {
double lChild, rChild, parent;
public Tree (double lChild, double rChild, double parent) {
this.lChild = lChild;
this.rChild = rChild;
this.parent = parent;
}
public double getLchild() {
return lChild;
}
public void setLchild(double lChild) {
this.lChild = lChild;
}
public double getRchild() {
return rChild;
}
public void setRchild(double rChild) {
this.rChild = rChild;
}
public double getParents() {
return parent;
}
public void setParents(double root) {
this.parent = root;
}
}
㈧ 构造哈夫曼树和哈夫曼编码,用java解答。
真懒啊你真懒啊你真懒啊你真懒啊你真懒啊你真懒啊你真懒啊你真懒啊你真懒啊你真懒啊你
㈨ java如何实现动态显示哈夫曼树意思就是显示每次两个叶子结合,最后组成了一颗树的那个过程。求大神
根据二叉树的性质:n2=n0-1,列方程组得{n2=n0-1,n0+n2=199},解方程组得n0=100,所以叶子结点有100个。
㈩ 求java代码,哈夫曼树,从文件中读取数据,生成哈夫曼树并将哈夫曼编码存入文件当中!!!急求啊!!
这个问题,不详细,数据是什么数据,权重的判断标准都不知道