旋**保持二叉查詢樹性質的查詢樹區域性操作。
左旋:
void leftrotate(node *x)
y->p = x->p;
if (x->p == nil)
else
else
}y->l = x;
x->p = y;
}
右旋:
void rightrotate(node *x)
y->p = x->p;
if (x->p == nil)
else
else
}y->r = x;
x->p = y;
}
13.2-1 寫出right-rotate的偽**。見筆記。
13.2-2 證明:在一棵有n個結點的二叉查詢樹中,剛好有n-1種可能的旋轉。
除根結點外,每個結點都能有父結點做旋轉。
n=1時,只有根結點,0種可能的旋轉。
假設n=k-1時,有k-2種旋轉。
當n=k時,新增了乙個結點,則此結點為葉子結點,該結點可與其父親旋轉。剛好有k-1種可能的旋轉。
因此有n個結點的二叉查詢樹剛好有n-1種可能的旋轉。
13.2-3 設在圖中左邊一棵樹中,a,b和c分別為子樹α,β和γ中的任意結點。如果將結點x左旋,則a,b和c的深度會如何變化?
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呼叫來右轉。
演算法導論13 2旋轉 練習總結
13.2 1 寫出right rotate 的偽 answer 偽 right rotata y x.left x.left y.right if y.right t.nil y.right.p x y.p x.p if y.p t.nil t.root y else if x x.p.left y...
演算法導論 第13章 紅黑樹
特點 1 每個節點的顏色或是紅,或是黑 2 根節點是黑色 3 葉節點是黑色 4 如果乙個節點是紅色,則葉子為黑 5 對每個節點,從該節點 紅黑樹插入流程 第一步 和bst的插入過程相似,將待插入節點z插入到乙個紅黑樹的葉子節點,並著紅色 因為第一步之後可能會違反紅黑樹的某些性質,所以要進行下一步 第...
《演算法導論》筆記 第2章
本章出現了全書第乙個演算法 插入排序。插入排序並不是最直觀的排序演算法,拿它做第乙個講解應該有其他的理由。通過插入排序的講解,偽 約定 迴圈不變式 演算法分析等最基礎的知識被帶了出來。此後又講了第二個演算法 合併排序,並引出了演算法設計中的兩種常見型別 增量法 incremental 和分治法 di...