1. 程式人生 > >最優二叉樹(哈夫曼樹)知識點

最優二叉樹(哈夫曼樹)知識點

路徑:在一棵樹中從一個結點往下到孩子或孫子結點之間的通路

結點的路徑長度:從根節點到該節點的路徑上分支的數目

樹的路徑長度:樹中每個結點的路徑長度之和

結點的權:給樹中的結點賦予一個某種含義的值,則該值為該節點的權

結點的帶權路徑長度:結點的路徑長度乘以結點的權

樹的帶權路徑長度(WPL:樹中所有葉子結點的帶權路徑長度 (Weight Path Length)

最優二叉樹(哈夫曼樹):帶權路徑長度最小的二叉樹

構造哈夫曼樹:

給定n個權值{w1,w2,…wn},則構造出的哈夫曼樹有n個葉子結點,構造過程如下:

1.       w1,w2…wn按從小到大排序,並將他們看做n棵只有一個結點的樹組成的森林;

2.       選出兩個根節點權值最小的樹合併,作為新樹的左右子樹,新樹的根節點權值是左右子樹根節點權值之和

3.       從森林中刪除選取的兩棵樹,將新樹加入森林

4.       重複2,3,直到只剩一棵樹,所得即為最優二叉樹

例項如下:給定權值{5,6,2,7,9}構造哈夫曼樹

解:(1) 排序後為w={2,5,6,7,9}

取出2,5          w={6,7,7,9}

取出6,7  w={7,9,13}

取出7,9         w={13,16}

取出13,16

上面的哈夫曼樹的wpl=6X2+7X2+2X3+5X3+9X2=65

哈夫曼樹在編碼中的應用:

在通訊中,經常需要將文字轉換成二進位制串,即編碼。為了使電文程式碼儘可能的短,需要另經常使用的字符采用短的編碼,使用頻率小的字符采用長的編碼。同時,一個字元的編碼不能包含另一個字元的編碼,例如A00B就不能是001,使用哈夫曼樹就可以很好的實現 ,

例如A,B,C,D,E的頻率分別是6,7,2,5,9 對應的哈夫曼樹為:

    

另左子樹的路徑為0,右子樹路徑為1

A:00    B:01  C:100  D:101  E:11