天天看點

算法基礎(八):超詳細最優二叉樹建構(1)

赫夫曼(huffman)樹也稱最有二叉樹,是一類帶全路徑長度最短的樹,有着廣泛的應用。比如一棵判定樹,根據學生的成績劃分及格還是不及格還是優、中等、良好。顯然用if-else或者switch就可以簡單實作,當然可以直接毫不考慮的直接這樣寫,但是如果我們再肯花點功夫,就可以得到更加高效的程式。我們可以以學生的總的學科分數的占的各個分數段的比率為權,構造一棵赫夫曼樹,這樣可以減少比較次數,提高程式運作效率。

構造赫夫曼樹的方法步驟其實很簡單--赫夫曼算法:

(1).

根據給定的n個權值{w1,w2,w3...,wn}構成n棵二叉樹的集合f = {t1,t2,....tn},其中每棵二叉樹ti中隻有一個帶權的wi的根節點,其左右子樹為空。

(2).

在f中選取兩棵根節點的權值最小的樹作為左右子樹構造一棵新的二叉樹,且置新的二叉樹的根節點的權值為其左、右子樹上根節點的權值之和。

(3).

在f中删除這兩棵樹,同時将新得到的二叉樹加入到f中。

(4).

重複(2)、(3),知道f中含一棵樹為止。

下面是構造huffmantree的代碼實作:

下面是main函數的測試:

運作結果:

算法基礎(八):超詳細最優二叉樹建構(1)

圖2:

算法基礎(八):超詳細最優二叉樹建構(1)

說明:其實根據上面的權值,樹有多種,但是wpl都是一樣的。

繼續閱讀