→ malowda: 不太會用顏色所以沒表現出7和20之間是紅色的 04/12 19:44
推 lei70200: 謝謝!!! 這樣看起來清楚多了@@!!! 04/12 19:56
→ kafka0829: 我234樹刪16那邊和你不太一樣耶.我root會變(12,15,20) 04/12 20:04
→ malowda: 刪16後原本16的右兄弟還有2個值也就要把17向下移,20向上 04/12 20:06
→ malowda: 移,還達不到要降階的條件 04/12 20:07
推 kafka0829: 可我看書上步驟~除root外,遇到2node要先轉成3或4node 04/12 20:09
→ malowda: 沒錯阿你要先把20移上去和17成為17,20這樣就是書上說的再 04/12 20:11
→ malowda: 向17,20借17向下移 04/12 20:12
推 kafka0829: 疑?所以他不是指搜尋的路上有遇到2node要先處理? 04/12 20:28
→ kafka0829: 而是找到要刪除的元素再判斷? 04/12 20:29
推 lei70200: 搜尋的路上有遇到就要先處理沒錯 04/12 20:32
推 lei70200: 兩位大大都沒錯,只是刪16跟刪13的圖錯了 04/12 20:39
推 APE36: k大的比較沒問題,那是王老師的版本... 04/12 20:46
→ malowda: B樹是要刪除的節點到樹根沒有辦法借(都只有1個KEY)才會向 04/12 21:14
→ malowda: 下降一階,這題還有一個節點有2個KEY怎麼會就降階 04/12 21:16
→ kafka0829: 不知道是否為top-down 2-3-4樹和n-way樹差別嗎? 04/12 21:25
推 kafka0829: topdown作法可避免backward restructuring path 04/12 21:36
→ malowda: k大你有看王老師的資料結構11-57(2014)delete有分三種情 04/13 11:08
→ malowda: 況,(1)sibling為2個node(分支為2)才和兄弟合併,(2)(3) 04/13 11:12
→ malowda: 都是兄弟有3或以上的node會先借1個來,所以我的刪16和13 04/13 11:16
→ malowda: 沒錯,你的2node是指節點內的2個值吧 04/13 11:16
→ kafka0829: 是使用第(1)個情況沒錯呀~同你的圖要刪16的2-3-4樹 04/13 12:14
→ kafka0829: 17為2node他的兄弟12也為2node所以合併變成(12,15,17) 04/13 12:15
→ kafka0829: 之後作刪除16動作,root就會變成(12,15,20) 04/13 12:16
→ kafka0829: 不知道步驟是否有錯~ 但參考步驟紅黑樹轉回的2-3-4樹 04/13 12:38
→ kafka0829: 應該是會長這樣~ 有錯再請高手補充... 04/13 12:39
→ malowda: 錯了,你刪16要先看他的兄弟,不是先看父節點(17) 04/13 14:55
→ malowda: (1)的情況是p為樹葉,這題帶(1)的話p指的是17那個它不是 04/13 14:58
→ malowda: 樹葉 04/13 14:58
推 kafka0829: 這邊的(1)是你回文的情況(1)=書上的(3)-① 04/13 15:08
推 kafka0829: 然後是依序往下處理q=17 p=parent=15所以使用3-1的case 04/13 15:13
→ kafka0829: downward pass,p與q是會移動的,當遇到2node先處理 04/13 15:15
→ kafka0829: 因為書上有些模糊,我有特地google找一些教材參考 04/13 15:18
→ malowda: 又不是要刪17你q指向17對嗎?第1個條件p有2個node則p為 04/13 15:21
→ kafka0829: 圖中的第三點剛好就是此種情況 04/13 15:21
→ kafka0829: q先指17確認不是2node才往下啊 04/13 15:22
→ malowda: root你覺得用你做的方式這個條件合嗎? 04/13 15:22
→ kafka0829: 他不是root 04/13 15:24
→ kafka0829: 一開始q為15為2node->root情況排除 往下17為2node處理 04/13 15:26
→ kafka0829: 看那張投影片,我的理解是這樣啦~ 04/13 15:27
→ malowda: 這個是剛好3層,如果是4層你不就要從第2層開始向下合併? 04/13 15:30
→ kafka0829: 投影片2的意思就表示遇到2node要先處理,而不是直接就 04/13 15:30
→ kafka0829: 是指到欲刪除的元素 04/13 15:31
→ kafka0829: 應該不會有你說的情況 04/13 15:32
→ kafka0829: 應該沒有第二層2node第三層也2node的case吧 04/13 15:34
→ kafka0829: 所以會到第三層,然後處理情況又和本題一樣了 04/13 15:37
推 lei70200: k大講得很對呀~先遇到2node先處理,全部處理完後再刪除 04/13 15:58
→ lei70200: 之後就停止做動作 04/13 15:59
推 lei70200: 這樣才符合Forward deletion,層層往下處理的意義 04/13 16:03
→ kafka0829: 我上面講得有點跳:我的意思是指第二層和第三層若同為 04/13 16:04
→ kafka0829: 2node則因為第二層已和root合併,所以原來第三層會變成 04/13 16:05
→ kafka0829: 就會變成4個兄弟所以不會出現bug問題 04/13 16:06