紅黑樹的刪除
紅黑樹的刪除共有12種情況,
設要刪除的節點為Z:
1.Z為根 且沒有孩子 直接刪除,將根賦空
2.Z為根 有一個紅孩子(由於第4條性質一定為紅孩子) 將孩子顏色->黑,當做新的根,刪除節點
3.Z紅色 直接刪除,判斷Z為父親的左孩子或右孩子 將其賦空 (此節點一定沒有孩子,因為2個孩子的已經處理過,一個紅孩子(兩個紅色節點不能相鄰),一個黑孩子(到終端節點黑節點數相同))
4.Z為黑色 有一個紅孩子 將紅孩子->黑,Z的父與Z的子相連,刪除Z
5.Z為黑色 沒有孩子(由於要刪除的是黑節點,整個過程通俗的理解就是想要借一個黑節點;當侄子為紅節點則可以變為黑節點,然後借來一個黑節點
5.1 兄弟為紅(初始狀態)
兄是父右,兄->黑,父->紅 ,以父為支點左旋 更新兄
兄是父左,兄->黑,父->紅,以父為支點右旋,更新兄
5.2兄弟為黑(初始狀態或調整狀態)
5.2.1左侄黑,右侄黑
5.2.1.1父黑: 兄->紅,以父親為當前節點向上調整 ,更新兄 (由於少了一個黑節點,則向上借黑節點)
初始狀態:
調整狀態:
5.2.1.2父紅:兄->紅,父->黑,結束
初始狀態:
刪除Z即可
調整中:
5.2.2左侄子紅,右侄子黑
5.2.2.1兄為父右:左侄子->黑,兄->紅,以兄弟為支點右旋 ,更新兄
初始狀態:
調整中:
5.2.2.2兄為父右:兄弟->父親的顏色,父->黑,左侄->黑,以父親為節點右旋 結束
5.2.3右侄紅(右侄子紅,左侄子黑;或者右侄子紅)
5.2.3.1兄為父右:兄弟->父親的顏色,父->黑,右侄->黑,以父親為支點左旋 結束
初始狀態:
刪除Z即可
調整中:
5.2.3.2兄為父左:右侄->黑,兄->紅,以兄弟為支點右旋 ,更新兄弟
通過上圖,可以看出,5.2.2.1狀態的下一個狀態是5.2.3.1
5.2.3.2狀態點的下一個狀態是5.2.2.2
這篇博客是有史以來寫的最認真的一個了,希望下次看的時候一下就能看懂,也希望能對看到這篇博客的人有一些幫助~
紅黑樹的刪除