看板 Grad-ProbAsk 關於我們 聯絡資訊
※ 引述《aerystyle (阿che)》之銘言: : 輸入:12.8.14.17.9.6.3.33.25.16 : 求SMMH結果? : _ : / \ : 3 33 : / \ / \ : 6 25 8 9 : / \ / \ : 12 14 16 17 : 這是我的答案,_代表空NODE,請各位高手幫我檢查一下是否有誤,謝謝 算了,寫下來好了。 SMMH的性質: * Root放空 * 任何一個節點的左子樹比右子樹小 * 對某個節點而言,考慮以此節點為根的子樹 根的左子樹擁有樹根所有後代中最小的值(所以不考慮樹根) 根的右子樹擁有樹根所有後代中最大的值(一樣不考慮樹根) 舉例:整顆樹的值都介於3~33,以3為根的子樹除了3以外都介於6~25。 因此在整個SMMH過程中都必須維持三個性質: P1. 如果某個節點有兄弟,左兄弟<右兄弟 P2. 如果某個節點有祖父,祖父的左兒子<該節點 P3. 如果某個節點有祖父,祖父的右兒子>該節點 插入時: 1. 先放在整顆 Heap 中最「後面」的位置(最後一層最右邊) 2. 如果他有左兄弟而且比他大(不滿足P1),交換左右兄弟 3. 由下往上檢查新節點祖父的左兒子和祖父的右兒子 如果新節點比祖父的左兒子小(不滿足P2),兩點交換 如果新節點比祖父的右兒子大(不滿足P3),兩點交換 在同時滿足P2和P3性質過後就算插入完成 Delete-min或Delete-max: 1. 把Heap最後一層最右邊的值拿去補要刪掉的值 2. 由上而下重新檢查P2和P3性質(類似上者) 有些書/講義會特別用「E」表示要插入/遞補的新節點... 在大小檢查完之後,最後再把E填上數字,這種表記方式好像還蠻常見的? ok,所以原題是要輸入:12.8.14.17.9.6.3.33.25.16 插入12 _ / 12 插入8,此時違反P1規則,交換左右: _ - / \ → / \ 12 8 8 12 插入14,但此時14比12更大,交換: _ - / \ / \ 8 12 → 8 14 / / 14 12 插入17,此時17比14還大,交換: _ - / \ / \ 8 14 → 8 17 / \ / \ 12 17 12 14 插入9,由於9位在8~17之間,沒問題: _ / \ 8 17 / \ / 12 14 9 插入6,首先由於左兄弟比較大,交換左右: 然後因為6比8還要小,因此交換: _ _ _ / \ / \ / \ 8 17 → 8 17 → 6 17 / \ / \ / \ / \ / \ / \ 12 14 9 6 12 14 6 9 12 14 8 9 插入3:此時3比12還小,交換 再往上一層後,3還是比6小,再換: _ _ _ / \ / \ / \ 6 17 → 6 17 → 3 17 / \ / \ / \ / \ / \ / \ 12 14 8 9 3 14 8 9 6 14 8 9 / / / 3 12 12 插入33:此時33比14還大,交換 再往上一層後,33還是比17大,再換: _ _ _ / \ / \ / \ 3 17 → 3 17 → 3 33 / \ / \ / \ / \ / \ / \ 6 14 8 9 6 33 8 9 6 17 8 9 / \ / \ / \ 12 33 12 14 12 14 插入25:25比17大,交換。交換之後25位在3~33之間,沒問題! _ _ / \ / \ 3 33 3 33 / \ / \ → / \ / \ 6 17 8 9 6 25 8 9 / \ / / \ / 12 14 25 12 14 17 插入16:左兄弟比他大,左右交換。 _ / \ 3 33 / \ / \ 6 25 8 9 / \ / \ 12 14 17 16 交換過後16位在6~25之間,沒問題!因此做完就是這樣: _ / \ 3 33 / \ / \ 6 25 8 9 / \ / \ 12 14 16 17 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.127.180.129
max1147:認真推一個 02/07 11:24
qqoil:寫得很詳細 02/07 11:59
jimmy90332:詳細推!!! 02/07 12:09
koehie:Thanks. 02/07 15:37
dy957:感恩! 02/07 23:06
skill91002:大推用心!!!!!!!! 02/07 23:27
willne:只有感謝! 02/07 23:36
jerryhu2:3Q 02/09 00:19
starkers:佛心推!! 02/23 19:18
iamjustakid:推! 02/25 21:58
a1098137129:推 12/29 00:17
arcticocean:寫的超清楚 感謝你! 01/09 19:55