假設用於通信的電文僅由8個字母組成,字母在電文中出現的頻率分別爲
0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10
請爲這8個字母設計哈夫曼編碼。
表格形式:
NO. | data | parent | Lchild | Rchild |
0 | 0.07(A) | 10 | NULL | NULL |
1 | 0.19(B) | 12 | NULL | NULL |
2 | 0.02(C) | 8 | NULL | NULL |
3 | 0.06(D) | 9 | NULL | NULL |
4 | 0.32(E) | 13 | NULL | NULL |
5 | 0.03(F) | 8 | NULL | NULL |
6 | 0.21(G) | 12 | NULL | NULL |
7 | 0.10(H) | 10 | NULL | NULL |
8 | 0.05 | 9 | 2 | 5 |
9 | 0.11 | 11 | 8 | 3 |
10 | 0.17 | 11 | 0 | 7 |
11 | 0.28 | 13 | 9 | 10 |
12 | 0.4 | 14 | 1 | 6 |
13 | 0.6 | 14 | 11 | 4 |
14 | 1.0 | NULL | 12 | 13 |
該表格也就是靜態三叉鏈表,小編自己由多加了一列編號,三叉鏈表從左到右依次爲權值(data)、雙親序號(parent)、左孩子序號(Lchild)、右孩子序號(Rchild)。
通俗的說,求哈夫曼編碼就是根據三叉鏈表計算出最優二叉樹,算法是(在鏈表權值內取最小的兩位權值相加,然後刪去最小的兩位數,將它們的和存入鏈表,然後重複取最小的兩個數,存入兩個數的和,刪去原來的兩個相加的小數。這一個循環的過程,一直到最後算出的那個最終的數,就是最優二叉樹的權值)
本題來講,第一步就是找到兩個最小的數,編號分別爲2(0.02),5(0.03).【一般以較小的數爲左孩子,較大的數爲右孩子】然後寫入到編號爲8的左孩子和右孩子的二叉鏈表處。直至填滿編號爲14的三叉鏈表。
二叉樹表示:
根據三叉鏈表,便可以畫出二叉樹,A-H對應着相應的數據,可以在二叉樹中找到對應的位置,按照左0右1的編碼規則,得到每個字母對應的哈夫曼編碼。(也就是每個字母對應的二叉樹路徑)
Endeavor