Transcript 第6 章
6.6 引線二元樹 訂正:6-61 6.6 下第 2 列 24-1 應為 24 -1 1 二元樹轉換成引線二元樹範例(1) A A B C B D E C G F D H E G F I H 2 I 二元樹轉換成引線二元樹範例(2) 3 1: 子樹鏈結 0: 引線鏈結 左 4 引線二元樹的優點 可利用 l_flag 及 r_flag 來判斷節點有幾個子樹 進行前序、中序、後序追蹤時,可以直接利用引線鏈 結,不必使用遞迴,效能較佳 引線二元樹的缺點 5 新增及刪除節點時必須重建引線,較原二元樹複雜許 多 引線二元樹新增節點範例 6 6.7 二元搜尋樹、平衡樹、B 樹 6.7.1 二元搜尋樹是一棵二元樹,每一個節點上均存放一個鍵值 資料,並且樹根之鍵值大於左子樹的所有鍵值,小於或等 於右子樹的所有鍵值,並且左右子樹也是二元搜尋樹。 33 11 78 20 48 33+ 7 99 55 二元搜尋樹的新增節點 複習:依序新增 128, 20, 80, 66, 135, 5, 141, 70 8 二元搜尋樹的刪除節點 9 二元搜尋樹的刪除節點範例(1) 10 二元搜尋樹的刪除節點範例(2) 33 11 78 20 48 99 33+ 刪除11 55 刪除78 刪除33 33 33+ 33 11 20 78 48 33+ 55 78 11 99 99 20 48 99 55 20 48 33+ 55 二元搜尋樹的刪除節點 (ch6_tree_7.java, ch6_tree_4.java) 共 3 種情況 1. 2. 葉節點:直接刪除 節點分支度為 1 1. 2. 3. 只有右子樹、沒有左子樹:將節點的父節點的(左or 右)子樹鏈 結指到此節點的右子樹的樹根節點 (如:第 10 頁投影片 (a) 中的 66 ) 只有左子樹、沒有右子樹:將節點的父節點的(左or 右)子樹鏈 結指到此節點的左子樹的樹根節點 (如:第 10 頁投影片 (a) 中的 80 ) 節點分支度為 2 從該節點的右子樹中找到 擁有大於或等於此節點資料並且是最接 近的值的節點,也就是中序追蹤之後繼節點,來取代目前節點 ,但須重組右子樹 (如:第 10 頁投影片 (a) 中的 20 及 128 ) 12 6.7.2 高度平衡二元樹 為了避免二元樹過度歪斜 (也就是左子樹與右子樹的深度相 差太大),常須將二元樹調整成高度平衡二元樹,使其所有 節點的左子樹與右子樹的深度相差最多為 1 節點左邊的數 字代表其左、 右子樹的深度 相減的結果 13 6.7.3 B 樹 二元搜尋樹擴充至 3 階搜尋樹 T 95 21 P0,1 T1 2 λ 14 P2,3 P1,2 T3 T2 78 11 λ λ λ 99 128 λ λ λ λ 6.7.3 B 樹 將節點子樹數目由 2 擴充成 m,資料數目由 1 擴充成 m-1 一個 m 階 B樹結構就是一個高度 ≧1 的m階搜尋樹,樹上 的每一節點均為 m 階節點,並具有以下特徵: 1.每一節點之分支度均小於等於 m。 2.每一個節點最多含有 m-1 個鍵值。 3.樹根節點至少有兩個子節點,除非它也是樹葉。 4.除了樹根節點和樹葉節點外的每一個節點至少都含 有 m/2 個子節點,最多有 m 個子節點。 5.所有樹葉節點均在同一層,亦即從樹根節點到樹葉節點 所經之路徑長度均相同。 6.樹的高度增加只發生於樹根節點一分為二時 15 B 樹新增資料的處理: 詳細步驟在 p.6-89 範例 (4-階 B 樹) 16 B 樹新增資料的處理範例(分裂過程) 17 B 樹刪除資料的處理:詳細步驟在 p.6-93 範例(3-階 B 樹) 18 6.8 樹狀結構的應用 --6.8.1 集合表示法和應用(跳過) 6.8.2 霍夫曼樹與資料壓縮(參考資訊概論上學期第 3 章 p43-46) • 霍夫曼樹: 得到霍夫曼 編碼的方法 資料元素 s m i l 19 霍夫曼碼 100 101 0 11 “queue”可壓縮成 “10 11 0 11 0” 5 0 3 0 2 1 e 1 2 2 1 2 q u e q u │L│= 3 3 0 e q 1 2 u │L│= 1 (a) 霍夫曼碼 10 11 0 (b) 20 2 1 │L│= 2 資料元素 q u e 1