看板 Grad-ProbAsk 關於我們 聯絡資訊
※ 引述《tomcallme (今天早上)》之銘言: 這題是依序:11,12,...,19 in ascending order 建2-3tree 然後 delete node14 吧? 剛剛參考了一下手邊的資料 ~ 洪逸的筆記 2-3tree的delete的確可以有兩種方法 1.從左子樹的MAX來補 2.從右子樹的MIN來補 : 14 : / \ : 12 16,18 : /\ / | \ : 11 13 15 17 19 : 刪除 14 : / \ 因為是刪除non-leaf : 12 16,18 選擇取左子樹最大去遞補 : / \ / | \ : 11 13 15 17 19 : 13 : / \ : 12 16,18 子點keys數小於1 又不能做rotation : / \ / | \ 故做combination 並斷連結 : 11 空 15 17 19 ************************************************************** : 13 : / \ : 空 16,18 父點keys小於1 還是不能做rotation : / | \ 故combine 並斷建結 : 11,12 15 17 19 ************************************************************** 修改過後的想法: 13 / \ 12 16,18 / \ / \ \ 11 空 15 17 19 將左子樹MAX(13)移至root 此時原先(13)的節點 key = 0 不符合2-3tree定義 所以將其左兄弟(11)與其父親(12)combination 此時: 13 / \ 空 16,18 / / \ \ 11,12 15 17 19 這時候原先(12)的節點 key = 0 因為右兄弟有兩個鍵值(16,18) 所以向右兄弟借一個鍵值(rotation)就是13下、16上 並且調整右子樹的子鏈結~這又是另一個故事了XD 如有錯誤請高手指證^^ : 13,16,18 root keys數目大於2 -> split : 11,12 15 17 19 : 16 : / \ : 13 18 將斷掉的接回 : / \ / \ : 11,12 15 17 19 : 應該是這樣吧 剛剛講錯了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.105.207.212 ※ 編輯: ubuntu123 來自: 112.105.207.212 (01/18 21:27)
tomcallme:想請問 你的右子樹斷建的時機是啥時? 01/18 21:43
tomcallme:是第一次做combination的時候嗎? 01/18 21:43
ubuntu123:我想法幾乎跟你一樣 唯獨在*號框起來那邊有點出入 01/18 21:56
ubuntu123:至於斷鍵時機點 我的想法就是因為出現underflow 01/18 21:58
tomcallme:我的想法:因為出現underflow 所以不能rotate 01/18 21:59
tomcallme:所以只能combine combine完斷建 等一切整好再接 01/18 21:59
ubuntu123:所以必須作rotation處理 下一個step若不斷鍵重組 01/18 22:00
tomcallme:我手邊沒資料XD 不過斷建應該是combine的配套吧~? 01/18 22:00
ubuntu123:就會違背search tree的定義 01/18 22:00
tomcallme:更改一下 因為rotate會出現underflow 所以不能rotate 01/18 22:01
tomcallme:阿~~明天去查書 = = 01/18 22:01
MiiQ:我想的跟T大一樣 01/18 22:04
tomcallme:我一直打錯 是overflow 不是 underflow 01/18 22:05
※ 編輯: ubuntu123 來自: 112.105.207.212 (01/18 22:29)
ubuntu123:修改過了 不知道有沒有比較合理一點@@? 01/18 22:30
※ 編輯: ubuntu123 來自: 112.105.207.212 (01/18 22:32)
sneak: 就會違背search https://daxiv.com 09/11 14:09