兄弟,你把如下第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代碼,哈夫曼樹,從文件中讀取數據,生成哈夫曼樹並將哈夫曼編碼存入文件當中!!!急求啊!!
這個問題,不詳細,數據是什麼數據,權重的判斷標准都不知道