1 每一個節點不是黑色的就是紅色的
2 根節點是黑色
3 從根節點出發到每一個葉節點的路徑上全部黑色節點的數量相等
4 每一個NULL節點當作黑色的節點
5 紅色節點的兩個子節點都是黑色的設計
已經有了AVL平衡樹,爲何還須要設計出一個紅黑樹。
由於紅黑插入比AVL快,快的緣由是,它可能會比AVL樹多一層,因此須要的處理就少一些,可是它查找可能要比AVL多一次搜索過程。3d
前提:插入的節點都是紅色的節點。若是父節點是黑色的,直接插入成功。其他的分如下幾種狀況blog
父節點是紅色的,叔父節點也是紅色的,這種狀況不須要區分,當前節點是父節點的左節點仍是右節點,處理邏輯是同樣的。
搜索
如上圖,咱們插入一個節點33, 違背規則5,將父節點與叔父節點塗黑,以後違背規則3,將祖父節點塗紅,結果以下圖im
這個時候進入第二種狀況d3
父節點是紅色的,叔父節點是黑色的,這裏又有兩種狀況,分父節點是祖父節點的左節點仍是右節點。db
這裏又分2種狀況,當前節點是父節點的左節點和右節點。img
這種狀況須要旋轉,與AVL樹的旋是同樣的。 以父節點30爲頂端,進行左旋,左旋後的結果以下圖:紅黑樹
這個時候以當前節點30的祖父節點爲頂端,進行右旋。旋轉前,須要將祖父節點67塗紅,父節點40塗黑,以符合規則3。
co
不討論這種狀況,與上面是對稱的。
刪除的狀況最多三次能夠平衡,若是刪除的是紅色節點,直接完成刪除動做,其它分如下幾種狀況
以下圖:
當刪除節點30的時候,先找30的後繼(注意還有前驅的概念)節點,而後用後繼節點替換掉30節點,以下圖:
用X代替30,X是空節點,這裏又分2種狀況,X是父節點的左節點仍是右節點,咱們這裏只討論右節點的狀況,左節點是對稱的。 將X的兄弟節點塗黑,X的父節點塗紅,以X的父節點爲頂端進行右旋,結果以下圖:
設Y爲X的兄弟節點,這個時侯有如下三種狀況:
這個時候只須要將Y塗爲紅色,X的父節點塗爲黑色。
這個時侯須要旋轉,將Y的右節點變爲黑色,緣由是Y自己也是紅色,最終確定是須要右旋的,這個時候Y的右節點會變爲Y的父節點的左節點,會形成紅紅衝空。 將25塗紅,26塗黑,以25爲頂端進行左旋:以下圖:
進入Y的左節點爲紅色的狀況
將Y的左節點25塗黑,Y26塗紅,X的父節點40塗黑,右旋,以下圖: