樹(習題課)

哈夫曼樹
  • 在一棵樹中,從一個結點到另外一個結點所通過的全部結點,被咱們稱爲兩個結點之間的路徑。

上面的二叉樹當中,從根結點A到葉子結點H的路徑,就是A,B,D,H。spa

  • 在一棵樹中,從一個結點到另外一個結點所通過的「邊」的數量,被咱們稱爲兩個結點之間的路徑長度。

仍然用剛纔的二叉樹舉例子,從根結點A到葉子結點H,共通過了3條邊,所以路徑長度是3。3d

  • 結點的帶權路徑長度,是指樹的根結點到該結點的路徑長度,和該結點權重的乘積。

b8014a90f603738d412c05b1d5c4cc57f919ec21.jpg
如上圖,假設結點H的權重是3,從根結點到結點H的路徑長度也是3,所以結點H的帶權路徑長度是 3 X 3 = 9。blog

  • 樹的帶權路徑長度(WPL),即在一棵樹中,全部葉子結點的帶權路徑長度之和。29381f30e924b899297af1c50dd96193087bf6eb.jpg

仍然以這顆二叉樹爲例,樹的路徑長度是 3X3 + 6X3 + 1X2 + 4X2 + 8X2 = 53隊列

哈夫曼樹:哈夫曼樹(Huffman Tree)是在葉子結點和權重肯定的狀況下,帶權路徑長度最小的二叉樹,也被稱爲最優二叉樹
  • 舉個例子,給定權重分別爲1,3,4,6,8的葉子結點,咱們應當構建怎樣的二叉樹,才能保證其帶權路徑長度最小?

原則上,咱們應該讓權重小的葉子結點遠離樹根,權重大的葉子結點靠近樹根。rem

下圖左側的這棵樹就是一顆哈夫曼樹,它的WPL是46,小於以前例子當中的53:it

如下說法錯誤的是(  A )
  • A. 哈夫曼樹是帶權路徑長度最短的樹,路徑上權值較大的結點離根較近。
  • B. 若一個二叉樹的樹葉是某子樹的中序遍歷序列中的第一個結點,則它必是該子樹的後序遍歷序列中的第一個結點。
  • C. 已知二叉樹的前序遍歷和後序遍歷序列並不能唯一地肯定這棵樹,由於不知道樹的根結點是哪個。
  • D. 在前序遍歷二叉樹的序列中,任何結點的子樹的全部結點都是直接跟在該結點的以後。
度爲二的樹就是二叉樹。(  錯 )

首先,咱們明確一個概念,樹的度數是按節點的最大度數來定義的。因此,度爲 2 的樹要求每一個節點最多隻能有兩棵子樹,而且至少有一個節點有兩棵子樹;這與二叉樹的要求:度不超過 2,就是說度也能夠是 1 或者 0相矛盾。
其次,二叉樹還有一個重要特色:左子樹和右子樹不同;而普通的樹不分左右子樹.class

二叉樹共有5種基本形態

(1)空二叉樹;(2)只有一個根結點的二叉樹;(3)只有左子樹;(4)只有右子樹;(5)左右子樹都有的二叉樹二叉樹

霍夫曼樹的結點個數不能是偶數

首先,哈夫曼樹只有度爲0和2的節點。這是由於哈夫曼樹的構造老是以兩棵值最小的樹合併,每次合併都是兩棵子樹,不會有度爲1的節點。
由二叉樹性質,二叉樹的節點關係n0=n2+1,也就是度爲0的節點數老是比度爲2的節點數多1.若其中一個爲奇數那麼另一個就必然是偶數,加起來就仍是奇數。遍歷

哈夫曼樹的構造方法

假設有6個葉子結點,權重依次是2,3,7,9,18,25,如何構建一顆哈夫曼樹,也就是帶權路徑長度最小的樹呢?方法

第一步:構建森林

咱們把每個葉子結點,都當作樹一顆獨立的樹(只有根結點的樹),這樣就造成了一個森林:

在上圖當中,右側是葉子結點的森林,左側是一個輔助隊列,按照權值從小到大存儲了全部葉子結點。至於輔助隊列的做用,咱們後續將會看到。

第二步:選擇當前權值最小的兩個結點,生成新的父結點,不斷重複至只有一個節點。

藉助輔助隊列,咱們能夠找到權值最小的結點2和3,並根據這兩個結點生成一個新的父結點,父節點的權值是這兩個結點權值之和:

此時,隊列中僅有一個結點,說明整個森林已經合併成了一顆樹,而這棵樹就是咱們想要的哈夫曼樹:

相關文章
相關標籤/搜索