說明:赫夫曼樹在資訊傳輸上有很多的用途,剛剛學習二叉樹,就遇上了赫夫曼,在學習演算法的時候學到了不少的的東西。
**實現:
1 //哈弗曼節點資料結構
2 struct huffmannode//資料結構的設計是本赫夫曼的一大敗筆,我居然用了裡面的很多東西我居然用了指標。
3
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樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...