Java基礎-理解紅黑樹(刪除)

上一篇文章講解了 紅黑樹的插入操做  ,這篇講解一下紅黑樹的刪除操做。


在講解紅黑樹刪除以前,先簡單回顧下二叉樹的刪除操做。post


若是如今有一個二叉樹如上圖所示,我須要刪除66這個節點該怎麼作最快呢?3d

首先分析一下66這個節點的特色,在66的右邊子樹中,全部的節點都是比66大的。因此要想最快完成刪除操做,只須要在右邊子樹中,找出一個最小的來,替換掉66便可。而真正從樹上被剔除的節點,則是右子樹中最小節點的位置。如圖:cdn


一樣的思路,左邊子樹找出一個最大的替換也是能夠的。固然若是被刪除的節點自己左右兩個子節點只有一個或者都沒有值的話,那操做就更簡單了,直接剔除便可。blog

下面開始分析紅黑樹的刪除操做:get

紅黑樹刪除操做以下:it

  1. 根據二叉樹的刪除操做,找到真正須要從樹上剔除的節點。
  2. 若是須要剔除的節點爲黑色,調整紅黑樹的平衡(調整步驟以下)。
那麼調整平衡的時候,可能會遇到幾種狀況呢?其實不用說也應該知道,和插入操做的情形同樣,理論上講也是2種狀況。

第一種狀況,剔除節點(B)的兄弟節點(C)爲紅色(左下角爲須要剔除的節點):io


這種狀況咱們須要作的就是將兄弟節點(C)變爲黑色,將父節點(A)變爲紅色,對父節點
class

進行右旋操做。將C的左子節點做爲B的兄弟節點。
二叉樹


直接刪除B的話,會致使A左右兩邊黑色節點數不一致。形成紅黑樹失去平衡。最好的辦法就是把A的右邊也刪除一個黑色節點。可是由於B的兄弟節點C是紅色,因此不能直接對C進行變色操做。因此只能將AC的顏色互換,而後對A進行右旋操做。將C的左子節點賦給B,做爲B的兄弟節點,而由於C是紅節點,紅黑樹不能出現連續兩個紅節點,因此C的子節點必然是黑色。
lazyload

因此,通過一步調整,在不破換樹平衡的狀況下,咱們就能夠爲B找到黑色的兄弟節點了。

接下來的操做遵循狀況二便可。

第二種狀況,剔除節點(B)的兄弟節點(C)爲黑色(左下角爲須要剔除的節點):


這種狀況的話,能夠分爲兩種子狀況討論。

首先,C節點的兩個子節點都爲黑色。若是是這種狀況的話,操做就更簡單了,直接將C節點變爲紅色,而後以剔除節點(B)的父節點A進行迭代判斷便可。此處爲何要迭代呢?由於從A往下看他的左右兩邊雖然是平衡了,可是兩個子分支都少了一個黑色節點,因此必然會致使樹不平衡。若是A自己是紅色的話,那直接將A改爲黑色便可,若是A是黑色的話那就沒辦法了,只能以A爲基準向上迭代判斷。

而後若是C節點下面掛有紅色節點該怎麼辦?(C節點不能直接變紅)思路就是若是C節點下面掛有紅色節點,咱們應該想辦法把紅色節點挪到左邊去,讓他代替B節點,這樣就能夠直接調整到位,不破壞樹的平衡。具體調整步驟以下:


將D和A節點設置爲黑色,將C節點設置爲A原來的顏色,而後對A進行左旋操做便可。



因此其實理解一下的話,紅黑樹仍是很簡單的。

相關文章
相關標籤/搜索