2014-05-06 54 views
1

我正在閱讀Eternally confuzzled的紅黑樹教程。當被刪除的黑色節點的兄弟節點是紅色的時候,爲什麼紅色節點的內部子節點不能爲空紅色的黑色樹刪除情況?

在筆者介紹了從RB樹節點的刪除的部分,作者要求讀者找到解釋,練習:

它看到圖中,這是如何通過固定黑色恢復平衡後,很明顯高度,但它爲什麼2變紅是令人困惑的。那麼,紅色必須去某個地方,否則樹的黑色高度會受到影響,我們確信唯一已知的節點可以變成紅色,就是那個特定的孩子。我不記得我是如何找出紅色兄弟姐妹的情況,但我確信酒精是有關的。 :-) 第二個紅色的兄弟姐妹情況看着兄弟姐妹的內在孩子。這個孩子不能是一個空指針(練習:爲什麼?),所以我們只是測試一個孩子,並根據哪一個是紅色行事。如果外部的孩子是紅色的,我們執行了雙旋轉,顏色新的父黑色,其右孩子黑,它的左子紅:

怎麼筆者的結論是兄弟的內孩子不能一個空指針?爲什麼特定的孩子不能成爲空指針?爲什麼不是另一個孩子?

回答

2

如果是null,樹不會是有效的,因爲這property不會滿足:

每個紅色節點必須有兩個黑色的子節點。

爲什麼這個屬性很重要?

如果我們忽略了這個屬性,我們可以得到一個有效紅黑樹看起來像這樣:

B 
\ 
    R 
    \ 
    B 
    \ 
     R 
     \ 
     B 
     \ 
     ... 

這當然是絕對最壞情況下的二叉搜索樹。它基本上使它成爲一個鏈表 - 任何操作都需要O(n)

+0

一個確認:兄弟姐妹的內在孩子是指兄弟姐妹孩子的孩子(如大孩子)? – Tippis

+0

如果示例中的所有節點都有左葉節點(黑節點)。那麼wiki中的第5個屬性會被侵犯嗎? – Tippis

+0

在這種情況下,內心的孩子意味着正確的孩子。看看該網站的可視化,左邊的孩子在外面,而右邊的孩子更接近中間(因此「內部」)。是的,第五財產將被違反。 – Dukeling

0

我也有@Tipps提出的同樣的疑問。我的理解是作者在撰寫文章時沒有提到「每個紅色節點必須有兩個黑色子節點」的屬性。這篇文章推斷了RB樹必須持有的屬性,因爲它是由B樹生成的。

也許案件本身不存在?我在網上使用了免費的模擬器來驗證這種單黑孩子的紅父母情況理想情況下應該不存在於有效的RB樹中。「這些只是兄弟姐妹是黑色的情況。如果兄弟姐妹是紅的,那就更糟糕了,但我對你也有好消息,除了作爲一個知識分子的好奇心之外,下面的討論並不重要。「 - 來自同一文章

如果您觀察到RB-Tree重新平衡代碼取出了紅色兄弟情況,您會發現沒有特殊情況處理。雖然我仍然想知道爲什麼:

if (new_root) 
    root = p; 
else 
    root->link[dir] = p; 

是必要的嗎?這個更新是不是已經完成了單一輪換?