上一篇寫了234樹對比紅黑樹,和紅黑樹某些狀況須要調整的緣由,這篇就只寫紅黑樹的添加和刪除html
全部添加的節點默認都是紅色3d
全部節點默認爲紅色,添加後5爲根節點,違反了性質2"根節點是黑色" ,只須要將紅變黑便可htm
直接進行旋轉變色便可blog
而這裏面還有一種狀況遞歸
咱們須要先將5和6進行旋轉,讓它變成上面的狀況,而後按照上面的操做進行添加get
首先將父節點和叔叔節點變黑,爺爺節點變紅,若是10節點爲根節點,那麼再變黑,若是10節點變紅與上面發生衝突,那麼把10節點做爲新添加的節點,再繼續執行調整博客
狀況二叉樹
先說有兩個子節點的狀況,須要尋找到它的前驅或後繼節點來替代,而後刪除前驅或後繼節點,也就是將狀況轉換爲1或2方法
關於前驅或後繼節點看上篇文章im
沒有子節點且當前節點爲紅色直接刪除
1.2.1兄弟節點爲紅色
1.2.2兄弟節點爲黑色且有一個子節點
1.2.3兄弟節點爲黑色且有兩個子節點
1.2.4兄弟節點爲黑色,沒有子節點
須要將兄弟節點進行旋轉變色,爲何兄弟節點爲紅色須要旋轉變色緣由能夠看上一篇博客,將狀況變爲234
在這裏面還有一種 小狀況,兄弟節點的子節點若是離本身近須要先進行旋轉變色,將狀況變成上面的再進行操做
有兩種解決方法
1 先刪除5同時將15和20進行右旋變色,而後10和15進行左旋變色,而20和15就是上面的狀況,旋轉完後15兩個子節點必須是黑色,若是15節點於紅黑樹性質衝突,那麼在根據狀況調整
2 直接刪除5,而後10和20進行左旋,通常都用這個方法,減小一次旋轉
父節點爲紅色
刪除5,而後兄弟節點變爲紅色來維持父節點的左右黑色平衡,若是父節點爲紅色,直接變黑便可,父節點變黑是維護爺爺節點的左右黑色平衡
若是父節點爲黑色
一樣也是將兄弟節點變紅,而後把父節點向上遞歸處理
刪除一個黑色節點,而後改一個紅色節點,這個父節點的黑色是平衡了,若是上面還有節點呢,那麼黑色節點仍是不平衡,
這時就須要遞歸進行操做,直到出現紅色父節點將其變爲黑色或到達根節點爲止
直接刪除
只會有一種狀況,有一個紅色的左孩子或右孩子,若是有兩個孩子那麼就會去刪除前驅或後置而不是當前節點,
也不可能出現一個孩子爲黑色一個孩子爲紅色,更不可能出現只有一個黑色孩子,根據紅黑樹性質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)節點 若是還有父親則繼續遞歸操做,如今發現到根節點,調整完成
本文僅我的理解,若是有不對的地方歡迎評論指出或私信,謝謝٩(๑>◡<๑)۶