動畫 | 什麼是2-3樹?

咱們回憶一下AVL樹,它在插入和刪除節點時,總要保證任意節點左右子樹的高度差不超過1。正是由於有這樣的限制,插入一個節點和刪除一個節點都有可能調整多個節點的不平衡狀態。頻繁的左旋轉和右旋轉操做必定會影響整個AVL樹的性能,除非是平衡與不平衡變化不多的狀況下,不然AVL樹所帶來的搜索性能提高不足以彌補平衡樹所帶來的性能損耗。算法

那有沒有絕對平衡的一種樹呢?沒有高度差也不會有平衡因子,沒有平衡因子就不會調整旋轉操做。2-3樹正是一種絕對平衡的樹,任意節點到它全部的葉子節點的深度都是相等的。segmentfault

2-3樹的數字表明一個節點有2到3個子樹。它也知足二分搜索樹的基本性質,但它不屬於二分搜索樹。ide

2-3樹定義

一顆2-3樹或爲一顆空樹,或有如下節點組成:性能

2-節點,含有一個元素和兩個子樹(左右子樹),左子樹全部元素的值均小於它父節點,右子樹全部元素的值均大於它父節點;動畫

3-節點,還有兩個元素和三個子樹(左中右子樹),左子樹全部元素的值均小於它父節點,中子樹全部元素的值都位於父節點兩個元素之間,右子樹全部元素的值均大於它父節點;spa

子樹也是空樹、2-節點或者3-節點;3d

沒有元素相等的節點。視頻

file

2-3樹查找元素

2-3樹的查找相似二分搜索樹的查找,根據元素的大小來決定查找的方向。要判斷一個元素是否存在,咱們先將待查找元素和根節點比較,若是它和其中任意一個相等,那查找命中;不然根據比較的結果來選擇查找的方向。對象

file

2-3樹插入元素

插入元素首先進行查找命中,若查找命中則不予插入此元素,若是須要支持重複的元素則將這個元素對象添加一個屬性count。若查找未命中,則在葉子節點中插入這個元素。blog

空樹的插入很簡單,建立一個節點便可。若是不是空樹,插入的狀況分爲4種:

1.向2-節點中插入元素;

2.向一顆只含有一個3-節點的樹中插入元素;

3.向一個父節點爲2-節點的3-節點中插入元素;

4.向一個父節點爲3-節點的3-節點中插入元素。

向2-節點中插入元素

若是未命中查找結束於2-節點,直接將2-節點替換爲3-節點,並將待插入元素添加到其中。

file

向一顆只含有一個3-節點的樹中插入元素

若是命中查找結束於3-節點,先臨時將其成爲4-節點,把待插入元素添加到其中,而後將4-節點轉化爲3個2-節點,中間的節點成爲左右節點的父節點。若是以前臨時4-節點有父節點,就會變成向一個父節點爲2-節點的3-節點中插入元素,中間節點與父節點爲2-節點的合併。

file

向一個父節點爲3-節點的3-節點中插入元素

插入元素後一直向上分解臨時的4-節點,直到遇到2-節點的父節點變成3-節點再也不分解
。若是達到樹根節點仍是4-節點,則進行分解根節點,此時樹高+1(只有分解根節點纔會增長樹高),下面動畫2-3樹插入會出這個例子。

file

動畫:2-3樹插入

動畫視頻地址

2-3樹刪除

算法4紅黑樹刪除最小鍵這一小結裏沒有特別詳細地介紹,但給到了沿着左連接向下進行變換的三種狀況:

若是左子節點不是2-節點,完成;

若是左子節點是2-節點,而兄弟節點不是2-節點,將兄弟節點的最小元素移到父節點,父節點的最小元素移到左子節點;

若是左子節點是2-節點,而兄弟節點是2-節點,則左子結點、父節點中最小的元素和兄弟結點合併成4-結點。

file

刪除最小元素

咱們注意到在葉子節點不是2-節點的時候,刪除一個元素是很簡單的,並且刪除時不考慮自平衡處理。若是刪除一個2-節點會留下一個空節點,破壞了2-3樹的絕對平衡。因此,爲了保證不會刪除一個2-節點,能夠設定最左邊或者最右邊進行向下變換節點。這裏設置沿最左邊的連接,進行向下變換的三種狀況正是如上圖中,左子節點的父節點除了根節點都會變換成3-節點或4-節點。

刪除任意元素

刪除任意元素須要進行命中查找。若是查找未命中則忽略之;若是查找命中則向二叉堆同樣刪除任意元素,將帶刪除元素右子樹的最小元素替換到待刪除元素上,而後對右子樹進行刪除最小元素。

動畫:2-3樹刪除

動畫視頻地址
喜歡本文的朋友,歡迎關注公衆號「算法無遺策」,收看更多精彩內容

相關文章
相關標籤/搜索