1. 程式人生 > >2-3 查詢樹

2-3 查詢樹

文章目錄


在之前的二分搜尋和二叉查詢樹中已經能夠很好地解決查詢的問題了,但是它們在最壞情況下的效能還是很糟糕
理想情況下我們希望能夠保持二分查詢樹的平衡性。在一棵含有N個結點的樹中,我們希望樹高為 ~lgN,這樣我們就能保證所有查詢都能在 ~lgN 次比較內結束

一、定義

為了保證查詢樹的平衡性,我們需要一些靈活性,因此我們允許樹中的一個結點儲存多個鍵。
將一棵標準的二叉查詢樹中的結點稱為 2-結點,它含有一個鍵和兩條連結
引入 3-結點,它含有兩個鍵和三條連結。

一棵2-3查詢樹或為一棵空樹,或由一下結點組成:
2-結點,含有一個鍵(及其對應的值)和兩條連結,左連結指向的鍵都小於該結點,右連結指向的鍵都大於該結點。
3-結點

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

這裡寫圖片描述
一棵完美平衡的2-3查詢樹中,所有空連結到根節點的距離都是相同的。

二、相關操作

2.1 查詢

2-3樹的查詢演算法與二叉查詢樹相似。
這裡寫圖片描述

2.2 插入

1、向2-結點中插入新鍵:
– 把這個2-結點替換成一個3-結點,將要插入的鍵儲存在其中
這裡寫圖片描述

2、向一棵只含有一個3-結點的樹中插入新鍵:
– 臨時將新建存入該結點,使之成為一個4-結點
– 將臨時的4-結點轉換成3個2-結點,樹高加一
這裡寫圖片描述

3、向一個父節點為2-結點的3-結點中插入新鍵:
– 臨時將新建存入該結點,使之成為一個4-結點
– 將 中鍵

插入到它的父節點中,父節點變成了一個3-結點
這裡寫圖片描述

4、向一個父節點為3-結點的3-結點中插入新鍵:
– 臨時將新建存入該結點,使之成為一個4-結點
– 將 中鍵 插入到它的父節點中,父節點也變成了一個4-結點,就這樣一直向上不斷分解臨時的4-結點並將中鍵插入更高層的父節點,直至遇到一個2-結點並將它替換為一個不需要繼續分解的3-結點。
這裡寫圖片描述

5、分解根節點
如果從插入結點到根節點的路徑上全都是 3-結點,我們的根節點最終變成一個臨時的4-結點
可以按照向一棵只有一個 3-結點 的樹中插入新鍵的方法處理。將臨時的4-結點轉換成3個2-結點,樹高加一
這裡寫圖片描述

三、效能分析

這裡寫圖片描述
因此,我們可以確定2-3樹在最壞情況下仍有較好的效能。
但是,和真正的實現還有一段距離。儘管可以用不同的資料型別表示 2-結點 和 3-結點,但程式碼量大,而且它們所產生的額外開銷可能會使演算法比標準的二叉查詢樹更慢。

幸運的是你將看到,只需要一點點代價就能用一種統一的方式完成所有變換,即紅黑二叉查詢樹。