紅黑樹添加刪除

上一篇寫了234樹對比紅黑樹,和紅黑樹某些狀況須要調整的緣由,這篇就只寫紅黑樹的添加和刪除html

紅黑樹

性質

  1. 每一個節點要麼紅色要麼黑色
  2. 根節點是黑色
  3. 每一個葉節點是黑色的,這裏葉子節點指空的節點,和二叉樹的葉子節點不一樣
  4. 每一個紅色節點的兩個子節點都是黑色
  5. 每一個節點到它的每一個葉子節點的全部路徑都包含相同數目的黑色節點

添加

全部添加的節點默認都是紅色3d

  1. 空節點
  2. 父節點爲黑色
  3. 父節點爲紅色

1 空節點

全部節點默認爲紅色,添加後5爲根節點,違反了性質2"根節點是黑色" ,只須要將紅變黑便可htm

2 父節點爲黑色

2.1 父節點爲黑色,直接添加,小於父添加左邊,大於等於添加右邊

3 父節點爲紅色

狀況1 祖孫三代在一條線

直接進行旋轉變色便可blog

而這裏面還有一種狀況遞歸

咱們須要先將5和6進行旋轉,讓它變成上面的狀況,而後按照上面的操做進行添加get

狀況2有叔叔節點

狀況2.1叔叔節點爲紅色

首先將父節點和叔叔節點變黑,爺爺節點變紅,若是10節點爲根節點,那麼再變黑,若是10節點變紅與上面發生衝突,那麼把10節點做爲新添加的節點,再繼續執行調整博客

刪除

狀況二叉樹

  1. 沒有子節點
  2. 有一個子節點
  3. 有兩個子節點

先說有兩個子節點的狀況,須要尋找到它的前驅或後繼節點來替代,而後刪除前驅或後繼節點,也就是將狀況轉換爲1或2方法

關於前驅或後繼節點看上篇文章im

沒有子節點

1.1 節點爲紅色

沒有子節點且當前節點爲紅色直接刪除

1.2 節點爲黑色

1.2.1兄弟節點爲紅色

1.2.2兄弟節點爲黑色且有一個子節點

1.2.3兄弟節點爲黑色且有兩個子節點

1.2.4兄弟節點爲黑色,沒有子節點

1.2.1兄弟節點爲紅色

須要將兄弟節點進行旋轉變色,爲何兄弟節點爲紅色須要旋轉變色緣由能夠看上一篇博客,將狀況變爲234

1.2.2兄弟節點爲黑色且有一個子節點

在這裏面還有一種 小狀況,兄弟節點的子節點若是離本身近須要先進行旋轉變色,將狀況變成上面的再進行操做

1.2.3兄弟節點爲黑色且有兩個子節點

有兩種解決方法

1 先刪除5同時將15和20進行右旋變色,而後10和15進行左旋變色,而20和15就是上面的狀況,旋轉完後15兩個子節點必須是黑色,若是15節點於紅黑樹性質衝突,那麼在根據狀況調整

2 直接刪除5,而後10和20進行左旋,通常都用這個方法,減小一次旋轉

1.2.4兄弟節點爲黑色,沒有子節點

父節點爲紅色

刪除5,而後兄弟節點變爲紅色來維持父節點的左右黑色平衡,若是父節點爲紅色,直接變黑便可,父節點變黑是維護爺爺節點的左右黑色平衡

若是父節點爲黑色

一樣也是將兄弟節點變紅,而後把父節點向上遞歸處理

刪除一個黑色節點,而後改一個紅色節點,這個父節點的黑色是平衡了,若是上面還有節點呢,那麼黑色節點仍是不平衡,

這時就須要遞歸進行操做,直到出現紅色父節點將其變爲黑色或到達根節點爲止

有子節點

  1. 刪除節點爲紅色
  2. 刪除節點爲黑色

1 刪除節點爲紅色

直接刪除

2 刪除節點爲黑色

只會有一種狀況,有一個紅色的左孩子或右孩子,若是有兩個孩子那麼就會去刪除前驅或後置而不是當前節點,

也不可能出現一個孩子爲黑色一個孩子爲紅色,更不可能出現只有一個黑色孩子,根據紅黑樹性質5就明白了

那麼來看只有一個紅色子節點狀況

先將10和它的紅色子節點20進行旋轉變色,而後直接刪除,5節點能夠是紅也能夠是黑

練習

添加

屬於有父節點和叔叔節點,且都爲紅色,根據添加的3.2.1父節點和叔叔節點都爲紅色進行變色處理

完成後發現由於變色6節點和4節點出現了連續兩個紅色,須要繼續調整,把6當作新添加的節點,發現屬於狀況3.1祖孫三代在一條線,將2和4節點進行旋轉變色

刪除

咱們刪除4節點,這裏4就是根節點

首先判斷是那種狀況,有兩個子節點那就是尋找前驅或後繼進行替換,咱們這裏使用前驅節點,也就是3

首先判斷3節點的狀況,沒有子節點,兄弟節點也沒有節點,那就是刪除狀況的1.2.4兄弟節點爲黑色,沒有子節點

首先將值覆蓋掉,而後刪除3節點,將3節點的兄弟節點變色爲紅色

而後發現父節點爲黑色,不能進行變色來平衡,那麼把2節點當作須要刪除的節點(並不真正刪除)繼續調整

發現兄弟節點爲黑色且有兩個子節點,屬於刪除狀況的1.2.3,只須要進行旋轉便可

刪除節點6

有兩個節點,尋找前驅或後繼,此次咱們使用後繼節點,也就是8,仍是首先把值賦給6,而後進行刪除

將8刪除,兄弟節點變色,發現父節點爲黑色,不能進行變色保持黑色平衡,那麼只能向上遞歸

將9的兄弟節點變色爲紅色,若是這個6 (8)節點 若是還有父親則繼續遞歸操做,如今發現到根節點,調整完成

本文僅我的理解,若是有不對的地方歡迎評論指出或私信,謝謝٩(๑>◡<๑)۶

相關文章
相關標籤/搜索