1. 程式人生 > >2-3查詢樹的插入與刪除

2-3查詢樹的插入與刪除

本片部落格前面部分擷取自演算法(第4版)

定義:

 


查詢:

要判斷一個鍵是否存在樹中,先將它和根節點中的鍵比較,如果它和其中任意一個相等,查詢命中;否則就根據比較的結果找到指向相應區間的連線,並在其指向的子樹中遞迴地繼續查詢,如果找到了空連線上,查詢未命中。

插入:

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

1、  向2-節點中插入新鍵

如果未命中查詢結束於一個2-節點,直接將2-節點替換為一個3-節點,並將要插入的鍵儲存在其中

2、  向一顆只含3-節點的樹中插入新鍵

先臨時將新鍵存入唯一的3-節點中,使其成為一個4-節點,再將它轉化為一顆由3個2-節點組成的2-3樹,分解後樹高會增加1

3、  向一個雙親節點為2-節點的3-節點中插入新鍵

先構造一個臨時的4-節點並將其分解,分解時將中鍵移動到雙親節點中(中鍵移動後,其雙親節點中的位置由鍵的大小確定)

4、  向一個雙親節點為3-節點的3-節點中插入新鍵

一直向上分解構造的臨時4-節點並將中鍵移動到更高層雙親節點,直到遇到一個-2節點並將其替換為一個不需要繼續分解的3-節點,或是到達樹根(3-節點)。

5、  分解根節點

如果從插入節點到根節點的路徑上全是3-節點,根將最終被替換為一個臨時的4-節點,將臨時的4-節點分解為3個2-節點,分解後樹高會增加1

變換:

1、區域性變換

將對一個4-節點的分解叫做變換,對一個4-節點的變換方式可能有6種:


這些變換都是區域性的,除了相關的節點和連結之外不必修改或檢查樹的其他部分

2、全域性性質:

變換不會影響樹的全域性有序性和平衡性,任意空連結到根節點的路徑長度依舊是相等的

生長:

後面部分參考自大話資料結構

刪除:

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

1、刪除非葉子節點key:

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

2、刪除葉子節點key:

a)        當前節點不是2-節點,直接刪除key

b)        當前節點是2-節點,刪除節點,並作一些判斷:

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

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

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

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