上面的二叉樹當中,從根結點A到葉子結點H的路徑,就是A,B,D,H。spa
仍然用剛纔的二叉樹舉例子,從根結點A到葉子結點H,共通過了3條邊,所以路徑長度是3。3d
如上圖,假設結點H的權重是3,從根結點到結點H的路徑長度也是3,所以結點H的帶權路徑長度是 3 X 3 = 9。blog
仍然以這顆二叉樹爲例,樹的路徑長度是 3X3 + 6X3 + 1X2 + 4X2 + 8X2 = 53隊列
原則上,咱們應該讓權重小的葉子結點遠離樹根,權重大的葉子結點靠近樹根。rem
下圖左側的這棵樹就是一顆哈夫曼樹,它的WPL是46,小於以前例子當中的53:it
首先,咱們明確一個概念,樹的度數是按節點的最大度數來定義的。因此,度爲 2 的樹要求每一個節點最多隻能有兩棵子樹,而且至少有一個節點有兩棵子樹;這與二叉樹的要求:度不超過 2,就是說度也能夠是 1 或者 0相矛盾。
其次,二叉樹還有一個重要特色:左子樹和右子樹不同;而普通的樹不分左右子樹.class
(1)空二叉樹;(2)只有一個根結點的二叉樹;(3)只有左子樹;(4)只有右子樹;(5)左右子樹都有的二叉樹二叉樹
首先,哈夫曼樹只有度爲0和2的節點。這是由於哈夫曼樹的構造老是以兩棵值最小的樹合併,每次合併都是兩棵子樹,不會有度爲1的節點。
由二叉樹性質,二叉樹的節點關係n0=n2+1,也就是度爲0的節點數老是比度爲2的節點數多1.若其中一個爲奇數那麼另一個就必然是偶數,加起來就仍是奇數。遍歷
假設有6個葉子結點,權重依次是2,3,7,9,18,25,如何構建一顆哈夫曼樹,也就是帶權路徑長度最小的樹呢?方法
第一步:構建森林
咱們把每個葉子結點,都當作樹一顆獨立的樹(只有根結點的樹),這樣就造成了一個森林:
在上圖當中,右側是葉子結點的森林,左側是一個輔助隊列,按照權值從小到大存儲了全部葉子結點。至於輔助隊列的做用,咱們後續將會看到。
第二步:選擇當前權值最小的兩個結點,生成新的父結點,不斷重複至只有一個節點。
藉助輔助隊列,咱們能夠找到權值最小的結點2和3,並根據這兩個結點生成一個新的父結點,父節點的權值是這兩個結點權值之和:
此時,隊列中僅有一個結點,說明整個森林已經合併成了一顆樹,而這棵樹就是咱們想要的哈夫曼樹: