演算法導論13 2旋轉 練習總結

2021-07-05 21:14:00 字數 1694 閱讀 9557

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 = x.p.left

else:

y = x.p.right

y.right = x

x.p = y

13.2-2 證明:在任何一棵有 n 個結點的二叉搜尋樹中,恰有 n-1 種可能的旋轉。answer:① 當n = 1 時,a(n) = 0 = 1 - 1,a(n) = a(i) + a(n-i-1) + 2,用數學歸納法容易證明 a(n) = n - 1.

② 當有 n 個結點時,共有 n - 1 對父子結點對,每一對父子結點對可形成乙個旋轉,所以有 n-1 中可能的旋轉。

13.2-3 設在圖 13-2 左邊一棵樹中,a、b 和 c 分別為子樹 α、β 和 γ 中的任意結點。當結點 x 左旋之後,a、b 和 c 的深度會如何變化?

answer:

deep(a) = deep(a) + 1;

deep(b) = deep(b);

deep(c) = deep(c) - 1。

answer:

證明:按照中序遍歷的順序,從根結點開始右旋,直至左子樹為空;然後對右子樹進行上述操作,直至二叉樹變成公升序排列的鏈。而沒進行一次上述的右旋操作,都會將乙個不在這樣的鏈上的結點旋轉到這樣的鏈上,所以該操作的步數為 o(n)。

每一棵 n 個結點的二叉搜尋樹都能通過這樣的 o(n) 的步數旋轉成右側伸展的鏈,再按照相應的逆操作即可通過 o(n) 次旋轉變成任意的 n 個結點的二叉搜尋樹。

13.2-5 如果能夠使用一些列的 right-rotate 呼叫把乙個二叉搜尋樹 t1 變為二叉搜尋樹 t2,則稱 t1 可以右轉成 t2。試給出乙個例子表示兩棵樹 t1 和 t2,其中 t1 不能夠右轉成 t2。然後,證明:如果 t1 可以右轉成 t2,那麼它可以通過 o(n^2) 次 right-rotate 呼叫來實現右轉。

answer:

不能右轉示例:

假設 t1 可以右轉成 t2,若 t1.root ≠ t2.root,則可以對 t1 進行 o(n) 次右旋變換成 t1.root = t2.root,然後對 t1 的左右子樹分別進行遞迴呼叫。t(n) = t(i) + t(n-i-1) + o(n),利用代入法或畫出遞迴樹易得 t(n) = o(n^2)。

《演算法導論》筆記 第13章 13 2 旋轉

旋 保持二叉查詢樹性質的查詢樹區域性操作。左旋 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 ...

演算法導論22 4拓撲排序 練習總結

22.4 1 給出演算法 topological sort 執行於圖 22 8 上時所生成的結點次序。這裡的所有假設和練習 22.3 2 一樣。22.4 2 請給出乙個線性時間的演算法,演算法的輸入為乙個有向無環圖 g v,e 以及兩個結點 s 和 t,演算法的輸出是從結點 s 到結點 t 之間的簡...

演算法導論15 1鋼條切割 練習總結

15.1 1 由公式 15.3 和初始條件t 0 1,證明公式 15.4 成立。15.1 2 舉反例證明下面的 貪心 策略不能保證總是得到最優切割方案。定義長度為i的鋼條的密度為pi i,即每英吋的價值。貪心策略將長度為n的鋼條切割下長度為i 1 i n 的一段,其密度最高。接下來繼續使用相同的策略...