天天看點

huffman tree的構造代碼如何保證其帶權路徑長度為最小

第一張圖是代碼,第二張圖是代碼的核心思想“将權值最小的兩個二叉樹合并”,和代碼聯系起來,就是,我用第三張圖中的1234567作為七個葉結點,把權值最小的兩個結點,也就是1和2作為兩個子結點,連結成一個新的二叉樹,并把他們的父結點表示為1和2的和,也就是3。此時的3同時也是非葉結點,然後把3看作新的要連結的結點,與剩下的34567作比較,

再把最小的3和3連結成一個二叉樹,同時把他們的父結點表示為3+3=6,又把6與4567比較,此時4和5最小,是以4和5連結,其父結點表示為9,如此繼續下去,直到最後成為了根結點為28的哈夫曼樹,哈夫曼樹的構造過程就是這樣,既然是哈夫曼樹,那麼問題來了,為什麼他的帶權路徑長度就是最小的呢?

1234567這幾個數字就是權,從根節點到每一個葉結點的線段邊的條數就是路徑,wpl就是帶權路徑長度,就是每個葉結點的權*路徑的值的總和。

我直接說規律,最後的wpl就是非葉結點的值的總和,就是上面第三張圖的3+6+12+9+16+28的和就是上述哈夫曼樹的wpl,怎麼來的有興趣自己研究,這裡就不廢話了。

重點是為什麼這和是最小的,根據哈夫曼樹的性質,n個葉結點就會伴随n-1個非葉結點,而每個非葉結點的值都為兩個葉結點的和,或者兩個非葉結點的和,或者一個葉結點一個非葉節點的和,有1234567 這七個葉結點就會加出六個非葉結點,根據代碼核心思想将最小的兩個結點加成非葉結點,就可以保證每次得到的非葉結點都會是權值最小的,因而所有非葉結點的權值和就是最小的

huffman tree的構造代碼如何保證其帶權路徑長度為最小
huffman tree的構造代碼如何保證其帶權路徑長度為最小
huffman tree的構造代碼如何保證其帶權路徑長度為最小

繼續閱讀