前言
二叉排序樹有簡單的實現,多數情況下可以得到滿意的查找效率,但畢竟存在順序查找的隱患。這種隱患來源於對於每次新插入的節點,沒有一種調節機制使這個新節點不至於成為隱患的導火索。也就是說,我們需要一種機制,在每次新插入節點后都要檢測樹是不是“歪了”。
定義
2-3樹是平衡的3路查找樹,其中2(2-node)是指擁有兩個分支的節點,3(3-node)是指擁有三個分支的節點。B-樹是一種平衡的多路查找樹,2-3樹屬於b-樹,其也同樣具有B-樹的性質,如m階B-樹,節點至多有m個分支、m-1個關鍵字;內部節點的分支數至少為m/2取上限;所有葉節點都出現在同一層次上,並且不帶任何信息(這是由構造樹的邏輯決定的,實際上指向這些節點的引用為null)。
2-3查找樹的定義如下:
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還要大。
插入
永遠都是在葉節點處插入新節點,當3-node變為4-node時,需要拆分節點,此時樹高就有可能增加。
刪除
刪除節點比插入節點麻煩一些,先來看刪除底部節點,在搜索過程中就需要對節點做相應的變化,以保證搜索路徑上的都是3-node或臨時的4-node,在刪除當前節點T時,T一定是3-node或4-node,就可以安全刪除了,刪除之后樹的變化規則與插入一致。刪除其他節點可以轉化為刪除底部節點,只需要將刪除元素與底部節點元素交換即可。
總結
2-3樹作為一種平衡查找樹,查詢效率比普通的二叉排序樹要穩定許多,其操作邏輯也非常清晰。2-3樹可以采用紅黑樹實現,使用二叉樹結構從邏輯上模擬了2-3樹,在插入刪除節點時,又具有二叉平衡樹的便利。