紅黑樹的插入總共不算映象的話總共五種情況:
插入就要做根,即插入之前樹中沒有結點,插入的這個結點就是m_head的parent
第二種就是插入的父親是黑的,所以不需要改變
第三種就是插入的父親是紅的,叔叔也是紅的,此時需要的操作是改色,將父親結點與叔叔結點的顏色變成黑的,將爺爺結點的顏色變成紅色,然後繼續向上遍歷,將所有的出現的這種情況都處理了,如果遇到根就先變紅再變黑,即遇到m_head就退出
第四種是父親是紅色,但是叔叔是黑的,我和父親一條線,進行單旋,單旋結束後將父親的額顏色變成黑色,爺爺的顏色變成紅色
最後一種如果我父親是紅色,叔叔黑色,但是我和父親不在一條線上沒救需要根據情況進行雙旋,第一次旋轉之後交換一下我和父親結點,然後就和第四種一樣了,最後記得將爺爺變紅,父親變黑
bool
insert
(const t & val)
else
if(val > cur-
>m_data)
else
}//上面的**完成的是查詢要插入的點的位置
cur =
new rbtreenode
(val);if
(val < pre-
>m_data)
else
cur-
>m_parent = pre;
//上面的**完成的是將要插入的點在pre的左邊還是右邊確定下來
if(pre-
>m_color == red)
else
rround
(grand)
; pre-
>m_color = black;
grand-
>m_color = red;
break;}
}}else
else
lround
(grand)
; pre-
>m_color = black;
grand-
>m_color = red;
break;}
}}}//省略的else是第二種情況
}else
//第一種情況
root-
>m_color = black;
m_head-
>m_left =
leftmost()
; m_head-
>m_right =
rightmost()
;return
true
;}
紅黑樹(插入)
紅黑樹的插入操作相對刪除操作比較簡單。紅黑樹要滿足 任一節點至null的任何路徑,所含黑節點數必須相同。所以,為了滿足此性質,插入節點應該為紅色。如果插入節點的父親為黑色,則不需要進行調整,若為紅色,有三種情況需要討論。1.父節點為紅色,叔節點為紅色 對於這種情況,同時改變父 叔節點顏色為黑色,並將...
紅黑樹插入
一 什麼是紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。紅黑樹是一棵二叉搜尋樹,它在每個結點上增加了乙個儲存位來表示結點的顏色,可以是red或black。一棵紅黑樹是滿足下面紅黑性質的二叉搜尋樹 1 每乙個結點或是紅...
紅黑樹 插入
一 滿足下面幾個條件的二叉搜尋樹,稱為紅黑樹 1.任何乙個節點都被著色 紅色或是黑色。2.根節點是黑色的。3.所有的nil節點都看成黑色 nil節點是就是乙個假想的或是無實在意義的節點,所有應該指向null的指標,都看成指向了nil節點。包括葉節點的子節點指標或是根節點的父指標 4.如果乙個節點是紅...