基於順序表哈夫曼樹

2021-09-20 14:01:45 字數 3735 閱讀 8998

說明:赫夫曼樹在資訊傳輸上有很多的用途,剛剛學習二叉樹,就遇上了赫夫曼,在學習演算法的時候學到了不少的的東西。

**實現:

1 //哈弗曼節點資料結構

2 struct huffmannode//資料結構的設計是本赫夫曼的一大敗筆,我居然用了裡面的很多東西我居然用了指標。

8     huffmannode(int elem,huffmannode * left=null,

9         huffmannode * right=null,

10         huffmannode * pr=null):weight(elem),leftchild(left),rightchild(right){}

11 };

12 

13 //哈弗曼類

14 class huffman

15 

25     void createhuffmantree(int n);

26     void translatecode(char * code,int sz,int n);

27     void safe(char * text,int n);

28 protected:

29     void select(int n,int &s1,int &s2);

30 };

31 

32 //列印哈夫曼樹

33 void showrhuffman(huffmannode* hf, int n);

34 void showlhuffman(huffmannode * hf, int n);

35 void showhuffman(huffmannode * hf, int n);

36 

37 

38 #include 

39 using namespace std;

40 #include "huffman.h"

41 #include 

42 

43 char ** huffmancode;

44 

45 

46 void space(int n)

47 

50 

51 void showrhuffman(huffmannode* hf, int n)

52 

58     else

59     

67     }

68 }

69 

70 void showlhuffman(huffmannode * hf, int n)

71 

77     else

78     

86     }

87 }

88 

89 void showhuffman(huffmannode * hf, int n)

90 

96     else

97     

103 }

104 

105 void huffman::select(int n,int &s1,int &s2)

106 

123     fst = p->weight;

124     s1 = i;

125     p++;

126     i++;

127 

128     while(p->parent)

129     

133     snd = p->weight ;

134     s2= i;

135 

136     //迴圈前的資料準備

137     p++;

138     int indexp = s2+1;

139 

140     if(fst<=snd)//fst始終是權重比較大的節點,在進入迴圈之前進行調換

141     

145     for(i=indexp;i<=n;i++,p++,indexp++)

146     

154             if(fstdata);

184         fs.get(test);

185         fs>>p->weight ;

186         fs.get(test);

187         //cout 188         p++;

189     }

190     fs.close();

191 

192     /*構建哈夫曼樹,因為在這裡我把哈弗曼的資料結

193     設計成了指標,所以用的都是指標,其實可以更簡單,

194     就是按書上的用陣列的下標。

195     下面這種做法有點生硬了,掉進了鍊錶的思路裡。*/

196     int s1,s2;

197     for(i=n;i<=m-1;i++)

198     

206 

207     //列印測試資料

208     

209     p = hf;

210     for(i=0;iweight <

213         p++;

214     }

215     cout parent)

231         

237         huffmancode[i] = new char[n-start];    //為當前的字元解碼分配儲存空間

238         strcpy(huffmancode[i],&cd[start]);

239 

240         //列印測試資料

241         

242         cout 

257         

268         }

269     }

270 }

271 

272 void huffman::safe(char * text,int n)

273 

287         }

288     }

289     ofs.close();

290 }

291 

292 

293 void main()

294 

326     ofs.close();

327     ofs.clear();

328 

329     huffman hftest;

330     hftest.createhuffmantree(n);

331 

332     ifs.open("tobetran.txt",ios::in|ios::beg);

333     ifs >> tobecode;

334     cout 

347     cout 

353     hftest.translatecode(code,strlen(code),n);

354     ::showhuffman(hftest.hf+(2*n-2),0);

355 

356     ifs.close(); 

357 }

基於順序表哈夫曼樹

說明 赫夫曼樹在資訊傳輸上有很多的用途,剛剛學習二叉樹,就遇上了赫夫曼,在學習演算法的時候學到了不少的的東西。實現 1 哈弗曼節點資料結構 2 struct huffmannode 資料結構的設計是本赫夫曼的一大敗筆,我居然用了裡面的很多東西我居然用了指標。3 8 huffmannode int e...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...