2-3樹插入、刪除操作

一、定義

2-3查找樹是平衡查找樹的一種,也就是說左右子樹高度相差不超過1,定義如下:

  1. 要麼爲空,要麼:

  2. 對於2節點,該節點保存一個key及對應value,以及兩個指向左右節點的節點,左節點也是一個2-3節點,所有的值都比key要小,右節點也是一個2-3節點,所有的值比key要大

  3. 對於3節點,該節點保存兩個key及對應value,以及三個指向左中右的節點。左節點也是一個2-3節點,所有的值均比兩個key中的最小的key還要小;中間節點也是一個2-3節點,中間節點的key值在兩個跟節點key值之間;右節點也是一個2-3節點,節點的所有key值比兩個key中的最大的key還要大

如果中序遍歷2-3查找樹,就可以得到排好序的序列。在一個完全平衡的2-3查找樹中,根節點到每一個爲空節點的距離都相同。

這裏寫圖片描述

二、查找

這裏寫圖片描述

三、插入

插入之前,先要對2-3樹進行一次未命中的查找

1、向2節點中插入節點

如果未命中查找結束於一個2節點,直接將2節點替換爲一個3節點,並將要插入的鍵保存在其中。
這裏寫圖片描述

2、向3節點中插入節點

① 父節點是2節點

可以將新的元素插入到3-node節點中,使其成爲一個臨時的4-node節點,然後,將該節點中的中間元素提升到父節點即2-node節點中,使其父節點成爲一個3-node節點,然後將左右節點分別掛在這個3-node節點的恰當位置。操作如下圖:.

這裏寫圖片描述

②父節點是3節點

當我們插入的節點是3-node的時候,我們將該節點拆分,中間元素提升至父節點,但是此時父節點是一個3-node節點,插入之後,父節點變成了4-node節點,然後繼續將中間元素提升至其父節點,直至遇到一個父節點是2-node節點,然後將其變爲3-node,不需要繼續進行拆分。

這裏寫圖片描述

③父節點到根節點均爲3節點

當父節點到根節點都是3節點的時候,這是如果我們要在字節點插入新的元素的時候,會一直查分到跟節點,在最後一步的時候,跟節點變成了一個4節點,這個時候,就需要將跟節點查分爲兩個2節點,樹的高度加1,這個操作過程如下:

這裏寫圖片描述

3、變換

對於4節點變形爲2-3節點,變形前後樹的高度沒有發生變化。只有當根節點是4節點,變形後樹的高度才加一。變換不會影響樹的全局有序性和平衡性。如下圖所示:

這裏寫圖片描述

三、刪除

1、刪除非葉子節點

使用中序遍歷下的直接後繼節點key來覆蓋當前節點key,再刪除用來覆蓋的後繼節點key

這裏寫圖片描述

2、刪除葉子節點

①刪除節點不是2節點,直接刪除

這裏寫圖片描述

②刪除節點是2節點

a:當前節點的雙親節點是2節點、兄弟節點是3節點,將雙親節點移動到當前位置,再將兄弟節點中最接近當前位置的key移動到雙親節點中

這裏寫圖片描述

b:當前節點的雙親節點是2節點、兄弟節點也是2節點,先通過移動兄弟節點的中序遍歷直接後驅到兄弟節點,以使兄弟節點變爲3節點;再進行a的操作

這裏寫圖片描述

c:當前節點的雙親節點是3節點,拆分雙親節點使其成爲2節點,再將再將雙親節點中最接近的一個拆分key與中孩子合併,將合併後的節點作爲當前節點

這裏寫圖片描述

d: 2-3樹是一顆滿二叉樹,將2-3樹層樹減少,並將兄弟節點合併到雙親節點中,同時將雙親節點的所有兄弟節點合併到雙親節點的雙親節點中,如果生成了4節點,再分解4節點即可

這裏寫圖片描述

參考:
1、Robert Sedgewick. 算法 第四版[M]. 北京:人民郵電出版社,2012.10
2、大話數據結構

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