資料結構—哈夫曼樹(最優二叉樹)
阿新 • • 發佈:2022-03-31
1.相關名詞:路徑,路徑長度,節點的權,節點的帶權路徑長度。
- 路徑:在一棵樹中,一個結點到另一個結點之間的通路,稱為路徑
- 路徑長度:在一條路徑中,每經過一個結點,路徑長度都要加 1 。例如在一棵樹中,規定根結點所在層數為1層,那麼從根結點到第 i 層結點的路徑長度為 i - 1
- 結點的權:給每一個結點賦予一個新的數值,被稱為這個結點的權。
- 結點的帶權路徑長度:指的是從根結點到該結點之間的路徑長度與該結點的權的乘積、
什麼是哈夫曼樹?
++當用 n 個結點(都做葉子結點且都有各自的權值)試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為“最優二叉樹”,有時也叫“赫夫曼樹”或者“哈夫曼樹” 。++
如何構建哈夫曼數?
在構建哈弗曼樹時,要使樹的帶權路徑長度最小,只需要遵循一個原則,那就是:權重越大的結點離樹根越近。在圖 1 中,因為結點 a 的權值最大,所以理應直接作為根結點的孩子結點。
哈夫曼樹的構建過程(重點):
對於給定的有各自權值的 n個結點,構建哈夫曼樹有一個行之有效的辦法:
- 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成一個新的二叉樹,且新二叉樹的根結點的權值為左右孩子權值的和;
- 在原有的 n 個權值中刪除那兩個最小的權值,同時將新的權值加入到 n–2 個權值的行列中,以此類推;
- 重複 1 和 2 ,直到所以的結點構建成了一棵二叉樹為止,這棵樹就是哈夫曼樹。