1. 程式人生 > >資料結構——2-3-4樹與紅黑樹

資料結構——2-3-4樹與紅黑樹

                          2-3-4樹與紅黑樹

2-3-4樹

       前面講到了2-3樹,2-3樹是允許節點最多有三個子節點的樹,2-3樹中有2節點和3節點,2節點跟普通的二叉樹節點一樣,3節點AB就是的左子樹上的所有節點的值小於A,中子樹上所有節點的值大於A而小於B,右子樹上節點的值大於B。2-3樹是一種平衡樹。        2-3-4樹跟2-3樹差不多,只不過是把節點的最大子節點個數擴充到了4個,所以2-3-4樹的節點有2節點3節點4節點四種,當發現插入節點是2節點或3節點時,就可以把節點進行擴容直接插入,如果發現是4節點的話,就向上回溯,把4節點進行分裂,並把中間的元素向上提。向上提時不可能回溯超過兩層,因為4節點的子節點不可能再有子節點了。在插入的時候,如果發現插入的節點已經是4節點了,那麼就要向上回溯分裂,如果發現插入節點的父節點是2或3節點,就直接上提,然後當前節點分裂,如果發現父節點是4節點,則父節點也分裂,這樣就導致上提不會提到父節點的父節點,所以父節點的父節點不會增加元素,因此一個4節點的子節點不會再有子節點了。所以插入位置的如果是4節點,要向上提回溯也不可以回溯很多層,這樣在插入或者刪除操作時效率就比普通的二叉平衡樹高多了。一但發現插入位置已經是4節點,而把插入節點分裂上提導致父節點也成為4節點,就將父節點也分裂。這樣能保證如果父節點已經是4節點,再向上提可父節點無法再分裂的情況。用這處條件再來約束就可以保證所有的4節點都在最下面一層,而且各個子樹的高度一樣,這樣樹一定是完全平衡的。

紅黑樹

       由於2-3-4樹的節點型別有3種,比較麻煩,因此可以用紅黑樹來表示2-3-4樹,任意2-3-4樹都可以轉換成一棵紅黑樹。紅黑樹通過給節點新增紅色和黑色來表示2-3-4樹的三種節點。紅黑樹2-3-4樹中的3節點變成兩個節點,而把4節點變成一個根節點+左右子節點的形式。由於3節點變成兩個節點,一個節點可以是另一個節點的左子樹或右子樹,所以在轉換成紅黑樹時,只考慮形成左子樹的,這種情況叫做左傾。並且為了維持紅黑樹中紅節點的子節點只能是黑節點,所以2-3-4樹中不能有兩個連續的3節點。當向2節點中插入時,如果插入的是左節點,則直接插入,如果是右孩子,因為要左傾,就需要插入後左旋。當向3節點中插入時,則一次左旋+右旋或者一次右旋,形成一個4節點。如果向4節點中插入,就需要將4節點進行分裂。這個分裂的過程在紅黑樹中表示得非常簡單,就是把兩個紅節點變黑,再把父節點的黑色變紅即可。      總的來說紅黑樹在插入時,如果發現插入節點為空,則插入,如果發現左右子節點都是紅節點,就是相當於插入4節點,就要先分裂,也就是把兩個紅色的子節點變黑,把黑色的父節點變紅。然後再比較插入的值和父節點的大小,如果等於,則插入失敗。如果小於,插入左子節點中,如果大於,則插入右子節點中。插入後可以會破壞紅黑色的特性,這時就需要一些旋轉來恢復。如果只有右子節點為紅節點,則左旋轉父節點,然後旋轉後如果左子節點和左子節點的左子節點都是紅色,則右旋轉。