source :
1. 哈夫曼樹的基本概念
哈夫曼樹( huffman )又稱最優二叉樹,是一類帶權路徑長度最短的樹,有著廣泛的應用。
在討論哈夫曼樹之前首先需要弄清楚關於路徑和路徑長度的概念。樹中兩個結點之間的路徑由乙個結點到另一結點的分支構成。兩結點之間的路徑長度是路徑上分支的數目。樹的路徑長度是從根結點到每乙個結點的路徑長度之和。
設一棵二叉樹有 n 個葉子結點,每個葉子結點擁有乙個權值w 1 ,w 2 , ...... w n ,從根結點到每個葉子結點的路徑長度分別為 l1 , l2......ln ,那麼樹的帶權路徑長度為每個葉子的路徑長度與該葉子權值乘積之各。通常記作 wpl = l k. w k 。為了直觀其見,在圖中把帶權的葉子結點畫成方形,其他非葉子結點仍為圓形。請看圖 6.21 中的三棵二叉樹以及它們的帶權路徑長。
(a) wpl=38 (b) wpl=49 (c) wpl=36 圖 6.21 具有不同帶權路徑長度的二叉樹
注意:這三棵二叉樹葉子結點數相同,它們的權值也相同,但是它們的 wpl 帶權路徑長各不相同。圖 6.21(c)wpl 最小。它就是哈曼樹,最優樹。哈夫曼樹是,在具有同一組權值的葉子結點的不同二叉樹中,帶權路徑長度最短的樹。也稱最優樹。
2. 哈夫曼樹的構造
構造哈夫曼樹的方法
對於已知的一組葉子的權值w 1 ,w 2...... ,w n
①首先把 n 個葉子結點看做 n 棵樹(僅有乙個結點的二叉樹),把它們看做乙個森林。
②在森林中把權值最小和次小的兩棵樹合併成一棵樹,該樹根結點的權值是兩棵子樹權值之和。這時森林中還有 n-1 棵樹。
③重複第②步直到森林中只有一棵為止。此樹就是哈夫曼樹。現給一組 (n=4) 具體的權值 2 , 4 , 5 , 8 ,下邊是構造具體過程:
圖 6.22 哈夫曼樹構造過程
圖 6.22(a) 是乙個擁有 4 棵小樹的森林,圖 6.22(b) 森林中還有 3 子棵樹,圖 6.22(c) 森林中剩下 2 棵樹,圖 6.22(d) 森林只有一棵樹,這棵樹就是哈夫曼樹。這裡或許會提出疑問, n 個葉子構成的哈夫曼樹其帶權路徑長度唯一嗎?確實唯一。樹形唯一嗎?不唯一。因為將森林中兩棵權值最小和次小的子棵合併時,哪棵做左子樹,哪棵做右子樹並不嚴格限制。圖 6.22 之中的做法是把權值較小的當做左子樹 , 權值較大的當做右子樹。如果反過來也可以,畫出的樹形有所不同,但 wpl 值相同。為了便於討論交流在此提倡權值較小的做左子樹 , 權值較大的做右子
哈夫曼樹 Huffman Tree
最優二叉樹 指帶權路徑長度最短的樹 class heapnode def init self,char none weight none left none right none self.char char self.weight weight self.left left self.right ...
樹 哈夫曼樹(Huffman Tree)
哈夫曼樹 樹的帶權路徑長度達到最小。1.將w1 w2 wn看成是有n 棵樹的森林 每棵樹僅有乙個結點 2.在森林中選出根結點的權值最小的兩棵樹進行合併,作為一棵新樹的左 右子樹,且新樹的根結點權值為其左 右子樹根結點權值之和 3.從森林中刪除選取的兩棵樹,並將新樹加入森林 4.重複 02 03 步,...
HuffmanTree,哈夫曼樹的原理和c 實現
目錄哈夫曼樹又稱為最優樹.通過權值來構造樹,權值越大,離根節點越近 經常用於無失真壓縮演算法 用於需要優化儲存空間的場景 原理很簡單,不多贅述 需要注意 構建哈夫曼樹不僅要值,還需要對應的權值 比如越常出現的,權值越大 通過權值來構造哈夫曼樹 我畫了幾個圖,具體過程如下 上面通過權值構建了哈夫曼樹,...