CLRS 14.2如何擴張數據結構

14.2-1
對於MINIMUMMAXIMUM 這種屬於樹的全局屬性的可以直接修改(比如我們把哨兵結點的左右指針分別指向MINIMUMMAXIMUM)。
插入時,我們比較插入的結點的關鍵字,若關鍵字小於MINIMUM所指關鍵字,則將指向MINIMUM的指針指向新的關鍵字,否則不變;對於刪除操作,若刪除了最小關鍵字,則將指向MINIMUM的指針指向被刪除關鍵字的後繼,因此若能在 O(1) 時間求出後繼,則可以在 O(1) 的時間更改MINIMUM的指針。同理,我們可以更改MAXIMUM指針。

下面說明如何在 O(1) 時間修改結點的SUCCESSORPREDECESSOR。注意到旋轉操作並不會改變結點的SUCCESSORPREDECESSOR屬性。所以會改變SUCCESSORPREDECESSOR屬性的是插入和刪除操作。
插入時,假設會插入到結點 x 的左邊,新結點爲 y ,那麼需要修改:

x.predecessor.successor = y
y.predecessor = x.predecessor
y.successor = x
x.predecessor = y

插入到結點 x 的右邊也可以相似的修改。
綜上可知可以在 O(1) 的時間完成。

14.2-2
可以將黑高作爲屬性來維護,由定理 14.1 可知,我們計算結點的黑高只需要結點的左右孩子信息。結點 x 的黑高是紅孩子的黑高,是黑孩子黑高加1。
對於插入操作,情況 1 中,設着色之前 α,β,γ,δ 的黑高都是 k ,所以結點 A,B,C,D 的黑高是 k+1 。着色之後,只有結點 C 的黑高變了,所以在RB-INSERT-FIXUP的第七行後加入z.p.p.bh=z.p.p.bh+1。情況 2 和 3 着色旋轉之後黑高並不改變。
對於刪除操作,情況 1 不改變黑高,情況 2 在RB-DELETE-FIXUP的第十行後面加上x.p.bh=x.bh即可,情況 3 也不改變黑高,情況 4 在RB-DELETE-FIXUP的第二十行後面加上x.p.bh=x.bh+1;x.p.p.bh=x.p.bh+1

對於維護結點深度,我們的答案是否。

14.2-3
顯然,對於任意結點 x 的屬性 x.f=x.left.fx.ax.right.f
對於一次旋轉,以右旋爲例,子樹α,β,γ 的屬性並不用變,對於 yf 域有 y.f=β.fy.aγ.f ,對於 xf 域有 x.f=α.fx.ay.f
這裏寫圖片描述

14.2-4
O(lgn) 的時間找到最接近 a 的元素,然後運行 mSUCCESSOR即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章