旋轉:保持二叉查找樹性質的查找樹局部操做。code
左旋:blog
void leftRotate(NODE *x) { NODE *y = x->r; x->r = y->l; if (y->l != nil) { y->l->p = x; } y->p = x->p; if (x->p == nil) { root = y; } else { if (x == x->p->l) { x->p->l = y; } else { x->p->r = y; } } y->l = x; x->p = y; }
右旋:ip
void rightRotate(NODE *x) { NODE *y = x->l; x->l = y->r; if (y->r != nil) { y->r->p = x; } y->p = x->p; if (x->p == nil) { root = y; } else { if (x == x->p->l) { x->p->l = y; } else { x->p->r = y; } } y->r = x; x->p = y; }
13.2-1 寫出RIGHT-ROTATE的僞代碼。class
見筆記。file
13.2-2 證實:在一棵有n個結點的二叉查找樹中,恰好有n-1種可能的旋轉。二叉樹
除根結點外,每一個結點都能有父結點作旋轉。im
n=1時,只有根結點,0種可能的旋轉。img
假設n=k-1時,有k-2種旋轉。co
當n=k時,添加了一個結點,則此結點爲葉子結點,該結點可與其父親旋轉。恰好有k-1種可能的旋轉。void
所以有n個結點的二叉查找樹恰好有n-1種可能的旋轉。
13.2-3 設在圖中左邊一棵樹中,a,b和c分別爲子樹α,β和γ中的任意結點。若是將結點x左旋,則a,b和c的深度會如何變化?
a-=1 b+=1 c+=1
13.2-4 證實:任何一棵含n個結點的二叉查找樹,能夠經過O(n)次旋轉,轉變爲另外一棵含n個結點的二叉查找樹。
能夠經過右旋全部有左孩子的節點將一顆二叉樹變成一個單鏈的僅有右孩子的二叉樹。
也能夠經過這個過程的反向操做將一個單鏈的二叉樹變成任意形態的二叉樹。
*13.2-5 若是可以使用一系列的RIGHT-ROTATE調用來把一個二叉查找樹T1變爲二叉查找樹T2,則說T1能夠右轉成T2。請給出一棵兩棵樹的例子,其中T1不能右轉成T2。而後證實若是T1能夠右轉成T2,則它能夠使用O(n^2)次RIGHT-ROTATE調用來右轉。