-
樹旋轉
鎖定
- 中文名
- 樹旋轉
- 外文名
- Tree rotation
- 類 型
- 子樹調整
- 對 象
- 二叉樹
- 旋轉方式
- 左旋轉和右旋轉
- 特 點
- 兩種旋轉呈鏡像,且互為逆操作
- 應 用
- 需要調整樹的局部平衡性的場合
樹旋轉簡介
樹旋轉圖示
樹旋轉包括兩個不同的方式,分別是右旋轉(以P為轉軸)和左旋轉(以Q為轉軸)。兩種旋轉呈鏡像,而且互為逆操作。
下圖示意了兩種樹旋轉過程中, 子樹的初態和終態:
+---+ +---+ | Q | | P | +---+ +---+ / \ right rotation / \ +---+ +---+ -------------> +---+ +---+ | P | | Z | | X | | Q | +---+ +---+ <------------- +---+ +---+ / \ left rotation / \ +---+ +---+ +---+ +---+ | X | | Y | | Y | | Z | +---+ +---+ +---+ +---+
__ / \ +---+ / +---+ | Q | / | Q | +---+ +---+ +---+ / +---+ +---+ | P | / \ R1 | P |/ / \ +---+ | Q | R0 +---+ / +---+ -----> +---+ / +---+ R2 | P | +---+ -----> / \ / | Z | / / | Z | -----> +---+ / \ +---+ +---+ +---+ +---+ +---+ +---+ / \ +---+ +---+ | X | | Y | | X | | Y | +---+ +---+ | P | | Z | +---+ +---+ +---+ +---+ | X | | Q | +---+ +---+ __ +---+ +---+ / \ / \ / \ +---+ +---+ L2 +---+ \ +---+ L0 +---+ +---+ | X | | Y | <----- | P | \ | P | <----- | Y | | Z | +---+ +---+ +---+ \ +---+ L1 +---+ +---+ +---+ +---+ / \ \| Q | <----- / \ | Q | +---+ \ +---+ +---+ \ +---+ | X | \ \ | X | \ / \ +---+ +---+ +---+ +---+ +---+ +---+ | Y | | Z | | Y | | Z | +---+ +---+ +---+ +---+
樹旋轉實現
上面的圖示僅描述瞭如何進行局部變換, 在實際應用中, 還需要將原有父節點的父節點納入考慮範圍. 以上述右旋轉為例, 如果 Q 是其父節點 root 的左子節點, 則在旋轉完後 root 的左子節點需要修改指向節點 P. 但這一點並沒有體現在上面的圖示中.
在接下來的實現中, 假設從樹中任一節點 N 能夠藉由 N.left 訪問其左子節點, N.right 訪問其右子節點, N.parent 訪問其父節點. 此外, 稱旋轉後變為父親的節點為轉軸pivot, 稱 pivot 在旋轉前的父節點為 parent, 而 parent 在旋轉前的父節點為 root. 則右旋轉過程可用偽代碼表示為:
[1]
func rotate_right(pivot): let parent = pivot.parent let root = parent.parent // R0 parent.left = pivot.right if pivot.right != nil: pivot.right.parent = parent // R1 pivot.parent = root if parent == root.left: root.left = pivot else: root.right = pivot pivot.right = parent parent.parent = pivot
樹旋轉旋轉距離
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:9次歷史版本
- 最近更新: 涵宇Q