AVL平衡樹插入刪除結點過程平衡操作圖示
阿新 • • 發佈:2018-12-16
AVL插入結點
通過這張圖來描述AVL平衡樹在插入新結點過程中,通過旋轉操作來達到自平衡的四種場景:
- LL單旋轉:新結點插入在A的左孩子(L)的左子樹(L),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號相同(2,1),只需要一次右旋操作即可重新達到平衡。
- LR雙旋轉:新結點插入在A的左孩子(L)的右子樹(R),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號不同(2,-1),先對以B為根的二叉樹左旋一次,再對以A為根的二叉樹右旋一次即可重新達到平衡。
- RL雙旋轉:新結點插入在A的右孩子(R)的左子樹(L),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號不同(-2,1),先對以B為根的二叉樹左旋一次,再對以A為根的二叉樹右旋一次即可重新達到平衡。
- RR單旋轉:新結點插入在A的右孩子(R)的右子樹(R),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號相同(-2,-1),對以A為根的二叉樹右旋一次即可重新達到平衡。
所以,實際上只有左旋和右旋兩種最基本的操作,只是每次旋轉的二叉樹不一樣。對一棵二叉樹進行旋轉,實際上就是讓其根結點的左孩子(右旋)或者右孩子(左旋)來代替原根結點的位置,並保證整棵樹中序遍歷的順序不變。
註解:
- 其中的A結點是插入新結點的祖先,在插入新結點前,以這個結點為根結點的二叉樹的平衡因子一定是1或者-1。
- 不平衡樹中的平衡因子的值限於-2,-1,0,1和2。
- 從根到新插入結點的路徑上,只有經過的結點的平衡因子才會在插入後改變。
- 圖中A/B/C這樣的代表單個結點,帶下標的結點都代表一顆子樹。
AVL刪除結點
刪除AVL平衡樹結點後的平衡處理和插入類似,不過有下面6種場景,刪除結點在A的右子樹為R型不平衡,刪除結點在左子樹為L型不平衡。對於這些場景,同樣是圍繞著對刪除前平衡因子為-1或者1,刪除後平衡因子為-2或者2的子樹進行討論:
- R0單旋轉:刪除的是A右子樹的結點,刪除後A的平衡因子為2,並且其左子樹的平衡因子為0,一次右旋操作即可重新達到平衡。
- R1單旋轉:刪除的是A右子樹的結點,刪除後A的平衡因子為2,並且其左子樹的平衡因子為1,一次右旋操作即可重新達到平衡。
- R-1雙旋轉:刪除的是A右子樹的結點,刪除後A的平衡因子為2,並且其左子樹的平衡因子為-1,因為刪除後A和B的平衡因子符號不同,所以需要兩次旋轉才能重新達到平衡。
- L0單旋轉:刪除的是A左子樹的結點,刪除後A的平衡因子為-2,並且其右子樹的平衡因子為0,一次左旋操作即可重新達到平衡。
- L-1單旋轉:刪除的是A左子樹的結點,刪除後A的平衡因子為-2,並且其右子樹的平衡因子為1,一次左旋操作即可重新達到平衡。
- L1雙旋轉:刪除的是A左子樹的結點,刪除後A的平衡因子為-2,並且其右子樹的平衡因子為-1,因為刪除後A和B的平衡因子符號不同,所以需要兩次旋轉才能重新達到平衡。
下面的圖描述了對R型不平衡的處理: