1. 程式人生 > 其它 >資料結構—哈夫曼樹(最優二叉樹)

資料結構—哈夫曼樹(最優二叉樹)

1.相關名詞:路徑,路徑長度,節點的權,節點的帶權路徑長度。

  • 路徑:在一棵樹中,一個結點到另一個結點之間的通路,稱為路徑
  • 路徑長度:在一條路徑中,每經過一個結點,路徑長度都要加 1 。例如在一棵樹中,規定根結點所在層數為1層,那麼從根結點到第 i 層結點的路徑長度為 i - 1
  • 結點的權:給每一個結點賦予一個新的數值,被稱為這個結點的權。
  • 結點的帶權路徑長度:指的是從根結點到該結點之間的路徑長度與該結點的權的乘積、

什麼是哈夫曼樹?

++當用 n 個結點(都做葉子結點且都有各自的權值)試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為“最優二叉樹”,有時也叫“赫夫曼樹”或者“哈夫曼樹”

++

如何構建哈夫曼數?

在構建哈弗曼樹時,要使樹的帶權路徑長度最小,只需要遵循一個原則,那就是:權重越大的結點離樹根越近。在圖 1 中,因為結點 a 的權值最大,所以理應直接作為根結點的孩子結點。

哈夫曼樹的構建過程(重點):

對於給定的有各自權值的 n個結點,構建哈夫曼樹有一個行之有效的辦法:

  • 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成一個新的二叉樹,且新二叉樹的根結點的權值為左右孩子權值的和;
  • 在原有的 n 個權值中刪除那兩個最小的權值,同時將新的權值加入到 n–2 個權值的行列中,以此類推;
  • 重複 1 和 2 ,直到所以的結點構建成了一棵二叉樹為止,這棵樹就是哈夫曼樹。