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)

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