1. 程式人生 > >AVL樹的單雙旋轉解析

AVL樹的單雙旋轉解析

【0】README

0.0) 本文部分idea 轉自:http://blog.csdn.net/collonn/article/details/20128205
0.1) 本文專注於 解析 AVL 樹的 單旋轉(左左單旋轉和右右單旋轉) 和 雙旋轉(左右雙旋轉和右左單旋轉)的內部核心技巧(歷時一天吧,估計);
0.2) 不得不提的是, 旋轉有兩個屬性: 軸 和 旋轉方向;
0.3) 20160127 last updating: 旋轉軸的確定 : (乾貨——單雙旋轉的旋轉軸確定 問題)

【1】 如何判斷進行單旋轉還是雙旋轉 (乾貨——什麼時候需要單選擇,而什麼時候需要多旋轉?)

1.1)單旋轉:

插入點不介於 不滿足AVL條件的樹根 和 樹根對應孩子節點之間;
1.2)雙旋轉:插入點介於 不滿足AVL條件的樹根 和 樹根對應孩子節點之間;

【2】單旋轉

2.1)左左旋轉(順時針旋轉): 從插入點回溯到第一個不滿足AVL條件的節點;本例中,插入點是10, 而第一個不滿足AVL條件的節點是30;將回溯路徑上的節點除節點30外,上移一層,節點30下移一層;

  • case1)
(這是一個左右雙旋轉特例,當不符合AVL條件的樹根和插入點的父節點只有一個子節點,且相反方向的子節點,當然了,插入點要介於樹根和插入點父節點之間的話,才滿足 雙旋轉特例的條件)

Attention)

  • A1)因為10 小於 20 且 小於30; 所以通過一次單旋轉就可以完成;
    (乾貨:也即是, 左左單旋轉時, 不滿足AVL條件的最小樹的根應該下移,該樹的其他節點上移,而不管 該樹的左子樹的右孩子 或者存在 或者 不存在,在旋轉過程中,都要把該左子樹的的右孩子新增以作為最小樹根的左孩子,因為即使不存在,新增null 也不影響最後的旋轉效果)

  • case2)
    這裡寫圖片描述

2.2)右右旋轉(逆時針旋轉): 從插入點回溯到第一個不滿足AVL條件的節點;本例中,插入點是10, 而第一個不滿足AVL條件的節點是30;將回溯路徑上的節點除節點30外,上移一層,節點30下移一層;

  • case1

    (這是一個右左雙旋轉特例,當不符合AVL條件的樹根和插入點的父節點只有一個子節點,且相反方向的子節點,當然了,插入點要介於樹根和插入點父節點之間的話,才滿足 雙旋轉特例的條件)

Attention)

  • A1)因為10 小於 20 且 小於30; 所以通過一次單旋轉就可以完成;
    (乾貨:也即是, 右右單旋轉時, 不滿足AVL條件的最小樹的根應該下移,該樹的其他節點上移,而不管 該樹的右子樹的左孩子 或者存在 或者 不存在,在旋轉過程中,都要把該右子樹的左孩子新增以作為最小樹根的右孩子,因為即使不存在,新增null 也不影響最後的 旋轉效果)

  • case2)
    這裡寫圖片描述

  • case3)為什麼經過右右單旋轉就可以修正成為 AVL 樹;因為 new point = 13 不在 4 和 7 之間, 所以一次單旋轉就可以了,無需雙旋轉;
    (乾貨——也就是說,new point 介於 不滿足AVL條件的樹根 和 其 孩子 之間的話,那麼就需要雙旋轉, 否則, 只需要 單旋轉就可以了)
    這裡寫圖片描述

Conclusion of single rotation)單旋轉有兩個屬性: 軸 和 旋轉方向

  • C1)單旋轉的軸: 相信你也看到了, 單旋轉的軸顯然是不符合AVL條件的樹根的直接孩子;

    • C1.1)左左單旋轉的軸:是不符合AVL條件的樹根的左孩子;
    • C1.2)右右單旋轉的軸:是不符合AVL條件的樹根的右孩子;
  • C2)旋轉方向:

    • C2.1)左左單旋轉方向:順時針方向;
    • C2.2)右右單旋轉方向:逆時針方向;

【3】雙旋轉

3.1)左右雙旋轉: (先左左單旋轉,再右右單旋轉; 即先順時針旋轉,後逆時針旋轉)

  • case1)因為47 介於 40 和 50 之間, 所以肯定需要雙旋轉;
    這裡寫圖片描述
    這裡寫圖片描述

3.2)右左雙旋轉:先將節點15向上提,還是不滿足AVL樹的條件,再把節點7向上提;(先右右單旋轉,再左左單旋轉; 即先逆時針旋轉,後順時針旋轉)
這裡寫圖片描述
這裡寫圖片描述

Conclusion of double rotations) 雙旋轉有兩個屬性: 軸 和 旋轉方向

  • C1)雙旋轉的軸:相信你也看到了, 雙旋轉的軸顯然是插入點的直接父節點;(除了兩個特例) (乾貨——雙旋轉的軸顯然是插入點的直接父節點(除了兩個特例, 而兩個特例的軸是插入點本身))

    • C1.1)左右單旋轉的軸:插入點的父節點;
    • C1.2)右左單旋轉的軸:插入點的父節點;
  • C2)旋轉方向:

    • C2.1)左右單旋轉方向:先右右單旋轉,再左左單旋轉;即先逆時針旋轉,再順時針旋轉;
    • C2.2)右左單旋轉方向:先左左單旋轉,再右右單旋轉;即先順時針旋轉,再逆時針旋轉;
      這裡寫圖片描述