1. 程式人生 > >平衡二叉樹(AVL樹) AVL樹(二)之 C++的實現

平衡二叉樹(AVL樹) AVL樹(二)之 C++的實現

3、旋轉

在進行插入和刪除之前需要先了解AVL樹的旋轉操作。旋轉操作主要包括LL(左左)旋轉、LR(左右)旋轉、RR(右右)旋轉、RL(右左)旋轉,LL旋轉與RR旋轉對稱,LR旋轉與RL旋轉對稱。旋轉操作是在插入結點或刪除結點導致原AVL樹不平衡時進行的。我的理解是當二叉樹失衡的原因出現在“最低失衡根結點左子樹的左子樹”(所謂“最低失衡根結點”,則是從新增結點開始向根部回溯,所遇到的第一個失衡的根節點)時,則使用LL旋轉來調整;當失衡出現在“最低失衡根節點左子樹的右子樹”,則使用LR旋轉調整;RR旋轉,RL旋轉同理。具體的定義和操作可以看skywang12345的的文章:AVL樹(二)之 C++的實現

(我的這篇文章就是基於此文章,為了加深印象,在這裡把實現再寫一遍,加一些自己的理解)。

3.1 LL旋轉

 

如上圖所示,找到“最低失衡根結點”,上圖是結點5,二叉樹失衡的原因是因為結點1的存在,而結點1位於結點5“左子樹的左子樹”,所以要使用LL旋轉來調節,只需一次旋轉即可達到平衡。具體的方法是:LL旋轉的物件是“最低失衡根結點”,也就是結點5,找到5的左孩子3,將3的右孩子4變成5的左孩子,最後將5變成3的右孩子,調整後的AVL樹如下所示:

具體程式碼:

複製程式碼
 
 
  複製程式碼
  
 

 3.2 RR旋轉

RR旋轉與LL旋轉對稱。

如上圖所示,“最低失衡根結點”是結點2,二叉樹的失衡是結點6導致的,而結點6位於結點2“右子樹的右子樹”,所以要使用RR旋轉來調節,只需一次旋轉即可達到平衡。方法與LL旋轉類似:RR旋轉的物件是“最低失衡根結點”,這裡是結點2,找到2的右孩子4,將4的左孩子3變成2的右孩子,最後將2變成4的右孩子,旋轉後的結果如下圖所示:

RR旋轉程式碼如下:

複製程式碼
 
 
  複製程式碼
  
 

 3.3 LR旋轉

LL旋轉和RR旋轉只需一次旋轉即可達到平衡,而LR旋轉和RL旋轉需兩次旋轉才能達到平衡。

 如上圖所示,“最低失衡根結點”為結點5,二叉樹失衡是因為結點3的存在,結點3位於結點5“左子樹的右子樹”,所以使用LR旋轉來調節。方法:(1)先對最低失衡根結點的左孩子(結點2)進行RR旋轉;(2)再對最低失衡根結點(結點5)進行LL旋轉。下圖演示了調整過程。

LR程式碼如下:

複製程式碼
 
 
  複製程式碼
  
 

3.4 RL旋轉

RL旋轉與LR旋轉對稱,先LL旋轉,在RR旋轉。

分析過程與LR相似。旋轉步驟:(1)先對最低失衡結點右孩子(結點5)LL旋轉;(2)在對最低失衡結點(結點2)RR旋轉。旋轉過程如下:

RL實現程式碼:

複製程式碼
 
 
  複製程式碼
  
 

4、插入結點與刪除結點

 

https://www.cnblogs.com/sench/p/7786718.html