紅黑樹 學習筆記2 旋轉

2021-08-17 08:50:43 字數 3286 閱讀 2381

接上,

演算法導論 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張圖帶你徹底理解紅黑樹 因為從這裡開始,是自己的學習筆記,從上面提到的文章中學習總結的,主要是為了給自己看,記錄哈,容易忘記,純概念,可能比較苦...