1. 程式人生 > >數據結構3 特殊二叉樹

數據結構3 特殊二叉樹

details article iad pan log 繼續 改進 png pos

技術分享圖片

1. 排序二叉樹、最優二叉樹、線索二叉樹、平衡二叉樹等是二叉樹的特殊形式,分別有各自的用途,排序二叉樹用於快速查找、最優二叉樹用於無損壓縮編碼、線索二叉樹通過保存結點的前驅後繼信息以方便遍歷、平衡二叉樹通過改進排序二叉樹提高了其整體查找效率。

2.對於最優二叉樹用於壓縮編碼,非常不解樹是如何用於編碼的。查閱相關文章後有了大概的了解,最優二叉樹是帶權路徑長度最短的二叉樹。結點的帶權路徑長度即權值與路徑的乘積。關於其在編碼方面的應用,有一篇博文介紹地比較直觀(http://blog.csdn.net/wo16fafafa/article/details/52420007),比如要傳送內容為”abc bcd cdd ddd d”的報文,其中字母a,b,c,d出現的次數分別為1,2,3,7。在數據通信中,需要將傳送的文字轉換成二進制的字符串,用0,1碼的不同排列來表示字符,如果字母只有a,b,c,d四個,可以用2位二進制編碼,讓00,01,10,11分別代表四位字母。但由於不同字母的使用頻率不同,這樣的等長編碼方式會導致流量的浪費,而且現實中字母當然不止4個,於是可以在設計編碼時,讓使用頻率高的用短碼,使用頻率低的用長碼,以優化整個報文編碼。

3. 上面所說的不等長編碼的設計過程也就是霍夫曼樹的構建過程。構建過程為:a, 當節點序列中的根節點數量多於一個時,從當前節點序列中選擇兩個權值最小的根節點,分別作為左右子節點,創建新的根節點;b, 從序列中刪除上一步選擇的兩個根節點,將新創建的根節點加入序列。然後重復執行這兩步。前面a,b,c,d的構建過程如下:

初始狀態:四個節點,按照權值由小到大排列

技術分享圖片

?第一步:選擇兩個權值最小的根節點,即a,b兩節點,構建新根節點,規定左子節點權值不大於右子節點權值

技術分享圖片


第二步:按照規則,繼續選擇兩個權值最小的根節點,構建新根節點

技術分享圖片


最終構建的霍夫曼樹:

技術分享圖片


左分支看作0,右分支看作1,則a,b,c,d對應的編碼為:a:000 b:001 c:01 d:1

整顆樹的帶權路徑長度WPL=1*3+2*3+3*2+7*1=22

而定長編碼的帶權路徑長度=(1+2+3+7)*2=26

參考資料:

http://blog.csdn.net/wo16fafafa/article/details/52420007

https://baike.baidu.com/item/%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91/2305769?fr=aladdin&fromid=1792010&fromtitle=%E6%9C%80%E4%BC%98%E4%BA%8C%E5%8F%89%E6%A0%91

數據結構3 特殊二叉樹