數據結構--2-3樹

2-3 查找樹(2-3-Search-Tree)

  • 2-結點:標準二叉樹中的結點稱爲2-結點(含有一個鍵和兩條連接)。git

  • 3-結點:包含兩個鍵和三條連接。github

定義:一顆2-3查找樹或爲一棵空樹,或由如下結點組成:微信

  2-結點,含有一個鍵(及其對應的值)和兩條連接,左連接指向的2-3樹中的鍵都小於該結點,右連接指向的2-3樹中的鍵都大於該結點。3d

  3-結點,含有兩個鍵(及其對應的值)和三條連接,左連接指向的2-3樹中的鍵都小於該結點,中連接指向的2-3樹中的鍵都位於該結點的 兩個鍵之間,右連接指向的2-3樹中的鍵都大於該結點。orm

2-3 查找樹(2-3-Search-Tree) 的操做

一棵完美平衡的2-3查找樹中全部空連接到根節點的距離應該都是相同的。cdn

查找

  2-3 查找樹中的查找與二分搜索樹的查找相似。要判斷一個鍵是否在樹中,先將它和根結點中的鍵比較。若是它和其中任意一個 相等,查找命中。不然,根據比較的結果找到指向相應區間的連接,並在其指向的子樹中遞歸繼續查找。若是是個空連接,查找未命中。blog

在如上圖所示的2-3樹中查找鍵爲2的結點是否存在,過程以下:遞歸

在如上圖所示的2-3樹中查找鍵爲17的結點是否存在,過程以下:get

插入

向2-結點中插入新鍵

  要在2-3樹中插入一個新的結點,相似於二分搜索樹的插入,先進行一次未命中的查找,找到要插入的結點所在的位置,將其掛在樹的底部。 但這樣一來樹就沒法保證完美平衡性。使用2-3的主要緣由:在插入新的結點以後可以繼續保持平衡。it

  若是未命中的查找結束於一個2-結點,就將這個2-結點替換爲3-結點,將要插入的鍵保存在其中便可。

  若是未命中的查找結束於一個3-結點,分析過程以下。

向一棵只含有一個3-結點的樹中插入新鍵

  在考慮通常狀況以前,先假設咱們須要向一棵只含有一個3-結點的樹中插入一個新鍵。這棵樹中有兩個鍵,因此在它惟一的結點中 已經沒有可插入新鍵的空間了。爲了將新鍵插入,先臨時將新鍵存入該結點中,造成一個4-結點(含有3個鍵和4條鏈接)。建立一個4-結點很方便, 由於很容易將其轉化成爲一棵由3個2-結點組成的2-3樹,其中一個結點(根)含有中鍵,一個結點含有3個鍵中的最小者(和根結點的左連接相連), 一個結點含有3個鍵中的最大者(和根結點的右連接相連)。這棵樹便是一棵含有3個結點的二叉查找樹,同時也是一棵完美平衡的2-3樹,由於其中全部的 空連接到跟結點的距離都相等。插入前樹的高度是0,插入後樹的高度是1。

向一個父結點爲2-結點的3-結點中插入新鍵

  假設未命中的查找結束於一個3-結點,而它的父結點是一個2-結點。在這種狀況下須要:在維持樹的完美平衡的前提下爲新鍵 騰出空間。 須要像剛纔同樣構造一個臨時的4-結點並將其分解,但此時不會爲中鍵建立一個新結點,而是將其移動到原來的父結點中。

  將此次轉換當作將指向原3-結點的一條連接替換爲新父結點中的原中鍵左右兩邊的兩條連接,並分別指向兩個新的2-結點。 根據假設,父結點中石油空間的:父結點是一個2-結點,插入以後變成了一個3-結點。另外,此次轉換也不影響(完美平衡的)2-3樹的 主要性質。樹仍然是有序的,由於中鍵被移到父節點中去了;樹仍然是完美平衡的,插入後全部的葉子結點到根結點的距離仍然相同。

上述過程是2-3樹動態變化的核心,圖示展現以下:

向一個父結點爲3-結點的3-結點中插入新鍵

  假設未命中查找結束於一個父結點爲3-結點的3-結點。依舊須要構造一個臨時的4-結點並分解它,而後將它的中鍵插入它的父結點中。因爲父結點也是一個3-結點,插入中間後又造成一個新的臨時4-結點,而後在這個節點上進行相同的變換,集分解這個父結點並將它的中鍵插入的它的父結點中去。推廣到通常的狀況,就是這樣一直向上不斷分解臨時的4-結點並將中鍵插到更高層的父結點,直到遇到一個2-結點並將它替換爲一個不須要繼續分解的3-結點,或者是到達3-結點的根。

圖示過程以下:

分解根結點

  若是從插入節點到根結點的路徑上都是3-結點,根結點最終變成一個臨時的4-結點。此時能夠按照向一棵只有一個*3-結點的樹中插入新鍵的方法處理這個問題。將臨時的4-結點分解爲三個2-結點**,樹高加1。此次最後的變化仍然保持了樹的完美平衡性,由於它變換的是根結點。

圖示過程以下:

4-結點的分解

  在2-3樹4-結點出現的位置有以下的幾種狀況。

  • 1.根結點

  • 2.父結點爲2-結點的左子結點或右子節點

  • 3.父節點爲3-節點的左子節點、中間的子結點或右子結點

下面咱們來詳細看一下在2-3樹中出現上述的位置時如何分解。

情形:

當臨時的4-節點出如今根節點:

當臨時的4-節點出如今2-結點的左側:

當臨時的4-節點出如今2-結點的右側:

當臨時的4-節點出如今3-結點的左側:

當臨時的4-節點出如今3-結點的中間:

當臨時的4-節點出如今3-結點的右側:

上述的狀況中,在變化的過程當中,只有當根節點最後爲臨時的4-節點,此時被分解成爲3個2-結點時,整個樹的高度纔會增長1。除此以外,插入一個結點2-3樹的高度仍是原來的高度。上述的變化過程當中:任何空連接到根節點的路徑長度都是相等的。

結論

  在一棵大小爲N的2-3樹中,查找和插入的操做訪問的結點必然不會超過lgN。

  • 證實:

一棵含有N個結點的2-3樹的高度在在log2 N和log3 N之間。


我的微信公衆號:

我的github:

github.com/FunCheney

相關文章
相關標籤/搜索