接上,
演算法導論 13.2 旋轉
當在某個結點
x x
上做 左旋 時,假設它的右孩子是
y' role="presentation" style="position: relative;">y
y而不是 t.
nil t.n
il; x x
可以為其右孩子不是 t.
nil' role="presentation" style="position: relative;">t.n
ilt.
nil結點的樹內任意結點。左旋以 x 到 y 的鏈為」支軸」進行。它使 y 成為該子樹新的根結點,
x x
成為 y' role="presentation" style="position: relative;">y
y的左孩子,
y y
的左孩子成為
x' role="presentation" style="position: relative;">x
x的右孩子。
課後習題:
13. 2-1 寫出 right_rotate 的偽**
right_rotate(t, y)
13. 2-2 證明:在任何一棵樹有
n n
個結點的二叉搜尋樹中,恰有 (n
−1)' role="presentation" style="position: relative;">(n−
1)(n
−1)次可能的旋轉。
proof: 顯然任意一對父子結點唯一確定一種旋轉,又除根結點以外,所有結點均有乙個父節點。
13. 2-3
13. 2-4 證明:任何一棵含有
n n
個結點的二叉搜尋樹可以通過 o(
n)' role="presentation" style="position: relative;">o(n
)o(n
)次旋轉,轉變為其他任何一棵含有
n n
(n−1)
' role="presentation" style="position: relative;">(n−
1)(n
−1)次右旋足以將樹變為一條右側伸展的鏈。)
proof: 定義 右鏈 為從根開始不斷向右的鏈,
從最右點開始,迴圈直至根結點:
如果 x
x
有左孩子,右旋,
' role="presentation" style="position: relative;">
退回 x
x
; ' role="presentation" style="position: relative;">
如果 x x
沒有左孩子,
x' role="presentation" style="position: relative;">x
x向上;
觀察這個操作,易知:每一次右旋都將乙個元素加入右鏈,命題得證。
2-5 如果能夠用一系列的 right_rotate 呼叫把乙個二叉搜尋樹 t1t1
變為二叉搜尋樹 t2t2
,則稱 t1t1
可以右轉(right-converted)成 t2t2
。試給出乙個例子表示兩棵樹 t1t1
和 t2 t
2,其中 t1t1
不能右轉成 t2t2
。然後,證明:如果 t1t1
可以右轉成 t2t2
,那麼它可以通過 o(
n2) o(n
2)次 right_rotate 呼叫來實現右轉。
proof: 記
s s
為所有內部結點的 (右子數量 - 左子數量) 之和。下證:
s' role="presentation" style="position: relative;">s
s隨右旋嚴格遞增。
考察乙個右旋操作:
除了 x x
和 y' role="presentation" style="position: relative;">y
y,其他結點對
s s
並無貢獻,
' role="presentation" style="position: relative;">
考察 s
s的增量 δs
=((1
+|β|
+|γ|
−|α|
)−(|
β|−|
α|))
+((|
γ|−|
β|)−
(|γ|
−1−|
α|−|
β|))
=2+|α|
+|γ|
>
1' role="presentation" style="position: relative;">δs=
((1+
|β|+
|γ|−
|α|)
−(|β
|−|α
|))+
((|γ
|−|β
|)−(
|γ|−
1−|α
|−|β
|))=
2+|α
|+|γ
|>1δ
s=((
1+|β
|+|γ
|−|α
|)−(
|β|−
|α|)
)+((
|γ|−
|β|)
−(|γ
|−1−
|α|−
|β|)
)=2+
|α|+
|γ|>
1
另一方面,
s s
的上限是 o(
n2)' role="presentation" style="position: relative;">o(n
2)o(
n2),即得。
紅黑樹 旋轉
此篇部落格我們討論紅黑樹的旋轉 左旋和右旋 為了更好的理解旋轉,我們只關注紅黑樹中關於二叉查詢樹部分的規則,而不關注紅黑樹中關於本身紅黑樹定義部分的規則。左旋現有紅黑樹結構如下 為了更好的理解,我們給節點x y a b和c乙個值,並把要進行左旋的節點x標為紅色 注意 和紅黑樹的紅色沒關係,僅僅起乙個...
紅黑樹學習筆記
二叉樹,他的定義是每個節點最多只有兩個子樹 即左子樹和右子樹,當然也可以沒有子樹 如下圖是乙個簡單的二叉樹 對於這樣的資料結構,在c語言中通常這樣來定義結構體?1 2 3 4 5 typedefstruct binary tree binarytree 二叉搜尋樹,首先他也是乙個二叉樹,與二叉樹不同...
紅黑樹學習筆記
因為學習hashmap的時候,遇到了紅黑樹,故而複習哈,想深度學習的請轉到下面鏈結,作者 並茂的詳細講解了哈,分析的很清楚,覺得好的不忘給別人手動比心。30張圖帶你徹底理解紅黑樹 因為從這裡開始,是自己的學習筆記,從上面提到的文章中學習總結的,主要是為了給自己看,記錄哈,容易忘記,純概念,可能比較苦...