我們先來回顧一下二叉吧查詢樹的插入,二叉查詢樹的插入主要就分為如下步驟:
查詢到要插入的key的位置
如果key已經存在,那麼就什麼也不做
如果key不存在,就插入新的節點。
對於紅黑樹而言,1和2步都和普通的二叉查詢樹的插入沒有分別。而當新的節點插入時,就可能會破壞紅黑樹的特性。因此需要通過一定的步驟來調整使其重新滿足紅黑樹的特性。
在此我們先來回顧一下紅黑樹的5個特性:
每個節點或者是黑色、或者是紅色。
根節點的顏色是黑色。
每個葉子節點是黑色。(這裡的葉子節點是為空nil的葉子節點)
如果節點是紅色的,那麼他的子節點必是黑色的。
從乙個節點到該節點下的葉子節點的所有路徑上包含相同數目的黑色節點。
對於新插入的節點而言,不妨先將它設定為紅色,那麼在插入新的節點後的二叉樹至少滿足1、3、5這三個特性的。下面我們就以新插入節點為當前節點對此二叉樹進行調整。為了方便表述我們對一些節點設定一些代號。
下面是對插入後的二叉樹進行調整的流程圖:
顯而易見,只要將n染成黑色便滿足所有的特性。
由於在插入前該二叉樹是一顆紅黑樹,滿足特性2,即根節點為黑色。
由於n為紅色,滿足特性4(即滿足五個特性),不需要做任何操作,當前就已經是一顆紅黑樹。
在當前條件下,由於在插入前二叉樹是一顆紅黑色樹,gf一定是黑色(特性4)。當前二叉樹滿足1、2、3、5四個特性,但是由於n是紅色且n的父節點f也是是紅色的,因此特性4不滿足。
2-2-1、f是紅色&&u是紅色
操作:gf設定成紅色,f、u設定成黑色
將gf視為n對二叉樹再次進行調整
操作過程如下圖所示,其中節點旁邊藍色的字表示從該節點到其葉子節點的黑色節點的數量。
2-2-2、f是紅色的&&u是黑色的
這種情況下,我們可以通過一些操作使得當前二叉樹在保持1、2、3、5特性的情況下滿足特性4,從而使得當前的二叉樹重新變成一顆紅黑樹。
2-2-2-1(左左)、f是gf的左孩子,n是f的左孩子
操作:對gf右旋
將f設定為黑色,將gf設定稱紅色
2-2-2-1(左右)、f是gf的左孩子,n是f的右孩子
操作:對f左旋
對gf右旋
將n置為黑色,將gf置為紅色
2-2-2-2(右右)、f是gf的右孩子,n是f的右孩子
操作:對gf左旋
將f設定為黑色,將gf設定為紅色
2-2-2-2(右左)、f是gf的右孩子,n是f的左孩子
操作:對f右旋
對gf左旋
將n置為黑色,將gf置為紅色
紅黑樹(插入)
紅黑樹的插入操作相對刪除操作比較簡單。紅黑樹要滿足 任一節點至null的任何路徑,所含黑節點數必須相同。所以,為了滿足此性質,插入節點應該為紅色。如果插入節點的父親為黑色,則不需要進行調整,若為紅色,有三種情況需要討論。1.父節點為紅色,叔節點為紅色 對於這種情況,同時改變父 叔節點顏色為黑色,並將...
紅黑樹插入
一 什麼是紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。紅黑樹是一棵二叉搜尋樹,它在每個結點上增加了乙個儲存位來表示結點的顏色,可以是red或black。一棵紅黑樹是滿足下面紅黑性質的二叉搜尋樹 1 每乙個結點或是紅...
紅黑樹 插入
一 滿足下面幾個條件的二叉搜尋樹,稱為紅黑樹 1.任何乙個節點都被著色 紅色或是黑色。2.根節點是黑色的。3.所有的nil節點都看成黑色 nil節點是就是乙個假想的或是無實在意義的節點,所有應該指向null的指標,都看成指向了nil節點。包括葉節點的子節點指標或是根節點的父指標 4.如果乙個節點是紅...