CLRS 13.2旋轉

13.2-1

RIGHT-ROTATE(T,x)
    y = x.left
    x.left = y.right
    if y.right ≠ T.nil
        y.right.p = x
    y.p = x.p
    if x.p == T.nil;
        T.root = y
    else if x == x.p.left
            x.p.left = y
    else x.p.right = y
    y.right = x
    x.p = y

13.2-2
一個父結點指向的右子女有一個左旋轉,一個父結點指向的左子女有一個右旋轉。也就是說有多少條邊就有多少種可能的旋轉,n 個結點有 n1 條邊,因此有 n1 種可能的旋轉。

13.2-3
我理解的是把圖 13-2 中的右邊樹中的結點 x 左旋變成圖 13-2 中左邊的的樹,因此 a 的深度減一, b 不變,c 加一。

13.2-4
首先證明可以旋轉成一條單鏈表。對於根結點左邊的孩子 x ,若 x 有右孩子則左旋 x ,對於根結點右邊的孩子 y ,若 y 有左孩子則右旋 y ,最後把根結點右旋,經過最多 n1 次旋轉就可以變成一根右側伸展的鏈。
對於其他的任何一顆樹,我們都可以旋轉成一根右側伸展的鏈。由可逆操作知道通過 O(n) 次旋轉可以把一顆二叉搜索樹轉變爲另外一顆二叉搜索樹。

13.2-5
T1,T2 分別對應下圖的左右二叉搜索樹,顯然 T1 不能右旋爲 T2
這裏寫圖片描述
通過右旋,T1 的右子樹中的點不能成爲新的根,若 T1T2 的根結點不同, 可以在 O(n) 的時間內將 T1 的根變爲 T2 的根,然後遞歸調用根的右子樹, 得 T(n)=T(n1)+O(n)T(n)=O(n2)

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