一、定義
2-3查找樹是平衡查找樹的一種,也就是說左右子樹高度相差不超過1,定義如下:
要麼爲空,要麼:
對於2節點,該節點保存一個key及對應value,以及兩個指向左右節點的節點,左節點也是一個2-3節點,所有的值都比key要小,右節點也是一個2-3節點,所有的值比key要大
對於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、大話數據結構