【C# 資料結構與演算法】哈夫曼樹
阿新 • • 發佈:2022-05-23
哈夫曼樹
定義
在含有n個帶權葉結點的二叉樹中,其中帶權路徑長度(WPL)最小的二叉樹稱為哈夫曼樹,也稱最優二叉樹
構造哈夫曼樹
給定n個權值分別為w1, w2..., wn的結點,構造哈夫曼樹的演算法描述如下:
1)將這n個結點分別作為n棵僅含一個結點的二叉樹,構成森林F。
2)構造一個新結點,從F中選取兩棵根結點權值最小的樹作為新結點的左,右(順序任意)子樹,並且將新結點的權值 置為左、右子樹上根結點的權值之和。
3)從F中刪除剛才選出的兩棵樹,同時將新得到的樹加入F中。
4) 重複步驟2)和3),直至F中只剩下一棵樹為止。
第一種方式
1)在森林中選擇權值最小的兩個子樹組成新的子樹:選a(權值為1) 和c(權值為2) 組成一個二叉樹 (權值 1+2);
2)新組成的子樹(權值為3),將新的子樹放入森林中。
3)重複(1)和(2)步驟。
第二種方式
特點
1)每個初始結點最終都成為葉結點,且權值越小的結點到根結點的路徑長度越大
2)哈夫曼樹的結點總數為2n -1
3)哈夫曼樹中不存在度為1的結點。
4)哈夫曼樹並不唯一,但WPL必然相同且為最優
應用
用於編碼
有哈夫曼樹得到哈夫曼編碼――字符集中的每個字元作為一個葉子結點,各個字元出現的頻度作為結點的權值,根據之前介紹的方法構造哈夫曼樹。路徑左邊為1,右邊為0(順序隨便)
1)固定長度編碼――每個字元用相等長度的二進位制位表示
2)可變長度編碼――允許對不同字元用不等長的二進位制位表示,此時的權值表示概率。概率高的離根節點越近。
假設,100題中有80題選c,10題選A,8題選B,2題選D
固定長度編碼
可變長度編碼
用於資料壓縮