1、從樹中乙個結點到另乙個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱作路徑的長度。
2、樹的路徑長度是從樹根到每一結點的路徑長度之和。
3、樹的帶權路徑長度(wpl)是樹中所有葉子結點的帶權路徑長度之和。
4、帶權路徑長度 wpl最小的二叉樹稱作哈夫曼樹。
根據給定的
n 個權值
構成 n
棵二叉樹的集合 f=
,其中每棵二叉樹 ti
中只有乙個帶權為 wi
根結點,其左右子樹均為空。在 f
中選取兩棵根結點的權值最小的樹作為左右子樹構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左右子樹上根結點的權值之和。在 f
中刪除這兩棵樹,同時將新得到的二叉樹加入
f 中。
重複 2和 3
步驟,直到
f只含一棵樹為止。這棵樹就是哈夫曼樹。
假設六個字母的頻率(權值)為 a27
,b8,
c15,d
15,e30
,f5 ,合起來正好是100%。
用哈夫曼演算法構造哈夫曼樹的過程如下:
1、先把字母按頻率從小到大的順序排列成乙個有序序列,即:f5
,b8,
c15,d
15,a27
,e30 。
2、取頭兩個最小權值的結點作為乙個新結點 n1
的兩個子結點,
f 為 n1
的左孩子,
b 為 n1
的右孩子,新結點的權值為兩個葉子權值的和 13。
3、將 n1
替換 f 和
b,插入有序序列中,保持從小到大排序。即:n1
13,c15
,d15,
a27,e
30 。
4、重複步驟 2。將 n1
與 c 作為乙個新結點 n2
的兩個子結點。n2
的權值為 28。
5、將 n2
替換 n1
和 c ,插入有序序列中,保持從小到大排序。即:d15
,a27,
n228,
e30。 6、重複步驟 2。將
d 與
a作為乙個新結點 n3
的兩個子結點。n3
的權值為 42。
7、將 n3
替換 d 和
a,插入有序序列中,保持從小到大排序。即:n2
28,e30
,n342
。 8、重複步驟 2。將 n2
與 e 作為乙個新結點 n4
的兩個子結點。n4
的權值為 58。
7、將 n4
替換 n2
和 e ,插入有序序列中,保持從小到大排序。即:n3
42,n4
58。
8、重複步驟 2。將 n3
與 n4
作為乙個新結點 n5
的兩個子結點。n5
的權值為 100。
左圖為構造哈夫曼樹的過程的權值顯示。右圖為將權值左分支改為 0,右分支改為 1 後的哈夫曼樹。
此時,對六個字母用從樹根到葉子所經過路徑的 0 或 1 來編碼,可以得到如下表所示的定義。字母a
bcde
f二進位制字元
011001
10100
111000
而若字母用相應的二進位制資料表示,則如下表所示:字母a
bcde
f二進位制字元
000001
010011
100101
則可以對比一下將文字內容「badcadfeed」編碼後的結果串:
若要設計長短不等的編碼,則必須是任一字元的編碼都不是另乙個字元的編碼的字首,這種編碼稱作字首編碼。
二叉樹與哈夫曼樹
1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...
樹與二叉樹 哈夫曼樹
01 路徑和路徑長度 定義 在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l 1。例子 100和80的路徑長度是1,50和30的路徑長度是2,20和10的路徑長度是3。02 結點的權及帶...
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...