huffman解碼演算法流程:
1.定義指標p指向赫夫曼樹結點,實際是記錄結點陣列的下標;
2.定義指標i指向編碼串,定義ch逐個取編碼串的字元;
3.初始化:讀入編碼串,設定p指向根結點,i為0;
4.執行以下迴圈:
a)取編碼串的第i個字元放入ch;
b)如果ch是字元0,表示往左孩子移動,則p跳轉到右孩子;
c)如果ch是字元1,表示往右孩子移動,則p跳轉到右孩子;
d)如果ch非0非1,表示編碼串有錯誤,輸出error表示解碼失敗;
e)檢查p指向的結點是否為葉子;
i.如果是葉子,輸出解碼,p跳回根節點;
ii.如果不是葉子,設定ch為3;
5.迴圈執行完後,如果ch值為3,輸出解碼失敗,否則成功結束。
解碼關鍵:赫夫曼編碼是一種字首編碼,解碼時不會因為編碼串混肴;
例如:字串aacacbdedddd 編碼後我們可以獲得對應的字首:
a: 10;b: 1110;c: 110;d: 0;e: 1111
它對應的編碼串即為:
假設結點權值不超過9999
//定義huffman樹結點類
class
huffnode;//
定義huffman樹類
class
huffman ;//
構建huffman樹
void huffman::maketree(int n,int wt,char data) //
引數是葉子結點數量和葉子權值
for(i=1;i<=len;i++)
maketree();
//呼叫私有函式建樹
}void huffman::selectmin(int pos,int *s1,int *s2)
//找出最小的兩個權值的下標
//函式採用位址傳遞的方法,找出的兩個下標儲存在s1和s2中
else
if(hufftree[i].weight < w2 && hufftree[i].parent == 0
)
//否則如果i結點的權值小於w2,且i結點是未選中的,把i結點的權值和下標儲存到w2和s2,作為第二最小值 }}
void
huffman::maketree()
}}//
銷毀huffman樹
void
huffman::destroy()
//huffman編碼
void
huffman::coding()
else
huffcode[i] = new
char[lnum-start]; //
為第i各字元編碼分配空間
huffcode[i].assign(&cd[start]); //
把cd中從start到末尾的編碼複製到huffcode中
}
delete cd; //
釋放工作空間}//
huffman解碼
int huffman::decode(const
string codestr,char
txtstr)
else
if(ch == '
1') //
同理
else
//解碼失敗
if(hufftree[c].leftchild == 0 && hufftree[c].rightchild == 0
)
else
}if(ch == '
\0') return
error;
else txtstr[k] = '
\0'; //
解碼成功,加入字串結束符
return
ok;
} //
主函式int
main()
else cout<
error!您輸入的編碼有誤,請重新執行本程式並輸入正確編碼。
"<
}myhuff.destroy();
}return
0;
}以下是我在huffman編碼解碼過程中的關鍵點,總結如下:
1.編碼從葉子開始,解碼則從根結點開始;
2.陣列下標最開始指向赫夫曼樹根結點,最終結束於葉子;
3.根據編碼表,編碼串0為左孩子,1為右孩子,根據左右孩子跳到相應結點,左右孩子為0則解碼完成;
4.如果編碼串掃瞄完後停在非葉子結點(左右孩子均為0的中間結點),則解碼失敗需要報錯;
基礎資料結構 二叉樹 赫夫曼樹的解碼(詳解)
huffman解碼演算法流程 1.定義指標p指向赫夫曼樹結點,實際是記錄結點陣列的下標 2.定義指標i指向編碼串,定義ch逐個取編碼串的字元 3.初始化 讀入編碼串,設定p指向根結點,i為0 4.執行以下迴圈 a 取編碼串的第i個字元放入ch b 如果ch是字元0,表示往左孩子移動,則p跳轉到右孩子...
資料結構 赫夫曼樹(最優二叉村)
赫夫曼樹,也稱最優二叉樹。樹的帶權路徑長度為樹中所有葉子節點的帶權路徑長度之和最短。書上舉例多if條件巢狀判斷,但由於各個條件出現的概率不一樣,優化條件排布的先生順序,程式執行的總路徑長度也不一樣,將高概率的條件放在前面,就使總長度最小。赫夫曼樹的原理就是這樣,在程式優化時,可以使用這個原理。發散 ...
構造赫夫曼樹(最優二叉樹)
例如,有權值分別為 5 10 15 20 25 40的結點,根據以上演算法構造出乙個哈夫曼樹。取這六個樹中最小的兩個樹5 10連成乙個二叉樹,其權值為15 此時森林裡的樹變為15 5 10 15 20 25 40。取這五個樹中最小的兩個樹 15 5 10 15 構成乙個新的二叉樹30 5 10 15...