1. 程式人生 > >紅黑樹-RBT(二、基本操作之左旋)

紅黑樹-RBT(二、基本操作之左旋)

都是 spa 左旋 class body 節點 圖片 如果 info

一、左旋

  1、當在含有n個關鍵字的紅黑樹上運行時,TREE-INSERT和TREE-DELETE操作對樹作了修改,結果可能違反(一、紅黑樹--》2、定義)中給出的紅黑樹的性質,為了保持這些性質,就要改變樹中的某些節點的顏色以及指針結構。

技術分享圖片

    對x進行左旋,意味著"將x變成一個左節點"。左旋以x到y之間的鏈為“支軸”進行。它使y成為該子樹新的根,x成為y的左孩子,y的左孩子成為x的右孩子。

  2、偽代碼:在LEFT-ROTATE得偽代碼中,假設right[x]!=nil[T]  

 1 LEFT-ROTATE(T, x)  
 2 y ← right[x]            // 前提:這裏假設x的右孩子為y。下面開始正式操作
3 right[x] ← left[y] // 將 “y的左孩子” 設為 “x的右孩子”,即 將β設為x的右孩子 4 p[left[y]] ← x // 將 “x” 設為 “y的左孩子的父親”,即 將β的父親設為x 5 p[y] ← p[x] // 將 “x的父親” 設為 “y的父親” 6 if p[x] = nil[T] 7 then root[T] ← y // 情況1:如果 “x的父親” 是空節點,則將y設為根節點 8 else if x = left[p[x]] 9 then left[p[x]] ← y //
情況2:如果 x是它父節點的左孩子,則將y設為“x的父節點的左孩子” 10 else right[p[x]] ← y // 情況3:(x是它父節點的右孩子) 將y設為“x的父節點的右孩子” 11 left[y] ← x // 將 “x” 設為 “y的左孩子” 12 p[x] ← y // 將 “x的父節點” 設為 “y”

技術分享圖片

  3、Right-ROTATE與LEFT-ROTATE的程序是對稱的。他們都是在O(1)時間內執行的。旋轉只有指針被改變;而節點中所有其他域都保持不變。

    

紅黑樹-RBT(二、基本操作之左旋)