演示2-3樹刪除時爲什麼空節點只有一個子節點

演示刪除時,爲什麼空節點下都只有一個子節點?自己好像是能想明白,但隔一段時間,再看時,又有點迷茫。所以嘗試着下來,加深理解。

1. 初始空節點的產生

要刪除的關鍵字要麼就是在葉節點;要麼交換中序排列中後一個關鍵字後到了葉節點。總之最終要刪除的關鍵字都會落到葉節點中。

如果葉節點是3-node,刪除這個關鍵字,3-node變爲2-node,就沒有空節點。

如果葉節點是2-node,刪除這個關鍵字,2-node就變爲了空節點。也就是初始空節點就是刪除2-node葉節點的關鍵字得到的。對這個初始空節點,我們認爲它只有一個子節點,而且這個子節點就是空節點,如下圖。      

 

2. 刪除過程中產生新的空節點。

如果初始空節點的父節點是3-node或者兄弟節點是3-node,經過相應操作,樹中不再含有空節點,刪除結束。

如果初始空節點的父節點和兄弟節點都是2-node,則要合併父節點和兄弟節點;釋放初始空節點,原來的父節點又變成了空節點,這時的空節點下面就只有一個子節點。如下圖的例子。

刪除節點15,它是2-node,

刪除這個關鍵字後,葉節點15變爲空節點。


空節點的父節點和兄弟節點都是2-node,合併父節點和兄弟節點;合併後父節點變爲空節點;原來的空節點被釋放。


因爲合併操作,現在空節點下就只有一個節點了!空節點下只有一個節點,是因爲空節點原來的關鍵字和其兩個節點中的一個子節點的關鍵字合併成了一個新的節點,而其另外一個子節點是上次的空節點,被釋放了。

再進行刪除操作,20和27合併,節點20就變爲空節點。上次的空節點就被釋放了。現在的空節點下面也是隻有一個子節點。


刪除空的根節點,得到新的根節點。

3. 小結

初始的葉節點是2-node,刪除關鍵字後變爲空節點,我們認爲它有一個子節點。

如果空節點的父節點和子節點都是2-node,合併父節點的關鍵字和子節點的關鍵字,得到一個新的3-node節點,然後父節點就變爲空節點,同時釋放原來的空節點。這樣空節點下同樣只有一個關鍵字。

如果空節點父節點和子節點至少有一個是3-node,那麼空節點被釋放(通過合併操作)或者空節點被重新填入關鍵字。總之樹上不在有空節點。刪除操作結束。

因此在演示刪除關鍵字的各種情況時,如果有空節點等待刪除,那麼就可以認爲這個空節點下只有一個子節點。

另外在用graphviz時,開始都是保持圖片,使用中發現,每次運行腳本後,在腳本保持的目錄下就生成“.png”文件,就是當前腳本運行產生的圖像;如果腳本沒有保存,就在安裝目錄下的bin目錄下生成一個“.png”文件。這樣就不需要每次都額外的點擊“graph-->setting->output file name”來保存文件了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章