基礎資料結構 二叉樹 赫夫曼樹的解碼(詳解)

2021-07-27 23:31:12 字數 2593 閱讀 1958

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...