AVL树的单双旋转解析
【0】README
0.0) 本文部分idea 轉自:http://blog.csdn.net/collonn/article/details/20128205
0.1) 本文專注于 解析 AVL 樹的 單旋轉(左左單旋轉和右右單旋轉) 和 雙旋轉(左右雙旋轉和右左單旋轉)的內部核心技巧(歷時一天吧,估計);
0.2) 不得不提的是, 旋轉有兩個屬性: 軸 和 旋轉方向;
0.3) 20160127 last updating: 旋轉軸的確定 : (干貨——單雙旋轉的旋轉軸確定 問題)
- 0.3.1)單旋轉:旋轉軸為 不滿足AVL條件的最小樹的樹根的相應孩子節點;
- 0.3.2)多旋轉:旋轉軸為 不滿足AVL條件的最小樹的樹根的相應孫子節點;
- 0.3.3) for updated source code , please visit https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter4/p80_AVL_last
0.4) for basic AVL info , please visit http://blog.csdn.net/PacosonSWJTU/article/details/49365415
【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)右左單旋轉方向:先左左單旋轉,再右右單旋轉;即先順時針旋轉,再逆時針旋轉;
總結
以上是生活随笔為你收集整理的AVL树的单双旋转解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么申请独立域名博客(怎么申请独立域名博
- 下一篇: 自底向上伸展树(之字形旋转+一字形旋转)