紅黑樹插入操作的各種情況分析

2021-10-11 15:26:22 字數 1611 閱讀 9865

目錄

1. 被插入的節點是根節點。

2. 被插入的節點的父節點是黑色。

3. 被插入的節點的父節點是紅色。

3.1 叔叔結點為紅色

3.2  插入結點的父結點p是祖父結點pp的左子結點,插入結點的叔叔結點s不存在或為黑色

3.2.1 插入結點是父結點p的左子結點

3.2.2 插入結點是父結點p的右子結點

3.3 插入結點的父結點p是祖父結點pp的右子結點,插入結點的叔叔結點s不存在或為黑色

3.3.1插入結點是父結點p的右子結點

3.3.2插入結點是父結點p的左子結點

紅黑樹的插入和搜尋二叉樹一樣,都需要先找到其插入位置。

插入的節點預設是紅色。(要是黑色的話,那所有性質都一直滿足,皆大歡喜了,就不用再平衡了,肯定不對)

然後再通過變色、左旋、右旋等滿足其性質。

插入的情況如下圖所示:

處理方法:直接把此節點塗為黑色。

處理方法:什麼也不需要做。節點被插入後,仍然滿足紅黑樹性質。

處理方法:這種情況下有連續兩個紅色節點,不滿足紅黑樹的性質,需要調整。簡單分析一下,被插入節點的父節點是紅色,那麼其祖父節點肯定存在且一定是黑色。我們依據其叔叔節點(其父親節點的兄弟節點)的情況,將這種情況進一步劃分。

我們可以將父親結點p和叔叔結點s變黑色,祖父結點變紅色就能解決問題。但是只是區域性的平衡,祖父結點變紅色還可能引起不平衡,因此還需要將祖父結點pp作為插入結點繼續向上的平衡。

這裡可能會有疑問:既然父結點為紅,為什麼叔叔結點會為黑色,這樣叔叔結點所在子樹的黑色結點數目不就多一了嗎?

答:因為類似於上述3.1向上平衡的情況,因此插入結點的叔叔結點有可能是黑色的。

這種情況意味著左邊子樹結點比右邊少,我們就需要通過右旋向右子樹去借節點。

因為把pp右旋後是黑色破壞了黑色結點的數量,因此還需要將pp變紅。p則需要變為原來pp的顏色,即黑色。

這種情況我們發現對插入結點的父結點p進行左旋,就變成情況3.2.1了,然後按照3.2.1進行處理

這種情況就是3.2情況的對稱情況,這裡有乙個小技巧,把3.2的情況的左右對換就是3.3情況了

這種情況和3.2.1類似,因為是對稱的,只要把左變成右,右變成左就行了。

這種情況是和3.2.2類似,我們對p右旋,轉為情況3.3.1

紅黑樹插入和刪除的各種情況分析

紅黑樹是一種自平衡的二叉查詢樹,是一種高效的查詢樹,定義如下 每個節點是紅色或黑色 根是黑色 所有葉子都是黑色 葉子是nil節點 如果乙個節點是紅色的,則他的兩個兒子是黑色的 從每個葉子到根的所有路徑上不能有兩個連續的紅色節點 從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點 簡稱黑高 ...

紅黑樹筆記 紅黑樹的插入操作

紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...

紅黑樹的各種操作

紅黑樹各種操作 include stdafx.h include using namespace std enum mycolor typedef int dtype struct rbtree 查詢節點資訊 rbtree search rbtree r,dtype val return x 左旋轉...