1. 程式人生 > >AVL平衡樹插入刪除結點過程平衡操作圖示

AVL平衡樹插入刪除結點過程平衡操作圖示

AVL插入結點

通過這張圖來描述AVL平衡樹在插入新結點過程中,通過旋轉操作來達到自平衡的四種場景:

  1. LL單旋轉:新結點插入在A的左孩子(L)的左子樹(L),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號相同(2,1),只需要一次右旋操作即可重新達到平衡。
  2. LR雙旋轉:新結點插入在A的左孩子(L)的右子樹(R),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號不同(2,-1),先對以B為根的二叉樹左旋一次,再對以A為根的二叉樹右旋一次即可重新達到平衡。
  3. RL雙旋轉:新結點插入在A的右孩子(R)的左子樹(L),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號不同(-2,1),先對以B為根的二叉樹左旋一次,再對以A為根的二叉樹右旋一次即可重新達到平衡。
  4. RR單旋轉:新結點插入在A的右孩子(R)的右子樹(R),這種場景在插入新結點後,同一路徑上的A和B的平衡因子符號相同(-2,-1),對以A為根的二叉樹右旋一次即可重新達到平衡。

所以,實際上只有左旋和右旋兩種最基本的操作,只是每次旋轉的二叉樹不一樣。對一棵二叉樹進行旋轉,實際上就是讓其根結點的左孩子(右旋)或者右孩子(左旋)來代替原根結點的位置,並保證整棵樹中序遍歷的順序不變。

註解:

  1. 其中的A結點是插入新結點的祖先,在插入新結點前,以這個結點為根結點的二叉樹的平衡因子一定是1或者-1。
  2. 不平衡樹中的平衡因子的值限於-2,-1,0,1和2。
  3. 從根到新插入結點的路徑上,只有經過的結點的平衡因子才會在插入後改變。
  4. 圖中A/B/C這樣的代表單個結點,帶下標的結點都代表一顆子樹。

AVL刪除結點

刪除AVL平衡樹結點後的平衡處理和插入類似,不過有下面6種場景,刪除結點在A的右子樹為R型不平衡,刪除結點在左子樹為L型不平衡。對於這些場景,同樣是圍繞著對刪除前平衡因子為-1或者1,刪除後平衡因子為-2或者2的子樹進行討論:

  1. R0單旋轉:刪除的是A右子樹的結點,刪除後A的平衡因子為2,並且其左子樹的平衡因子為0,一次右旋操作即可重新達到平衡。
  2. R1單旋轉:刪除的是A右子樹的結點,刪除後A的平衡因子為2,並且其左子樹的平衡因子為1,一次右旋操作即可重新達到平衡。
  3. R-1雙旋轉:刪除的是A右子樹的結點,刪除後A的平衡因子為2,並且其左子樹的平衡因子為-1,因為刪除後A和B的平衡因子符號不同,所以需要兩次旋轉才能重新達到平衡。
  4. L0單旋轉:刪除的是A左子樹的結點,刪除後A的平衡因子為-2,並且其右子樹的平衡因子為0,一次左旋操作即可重新達到平衡。
  5. L-1單旋轉:刪除的是A左子樹的結點,刪除後A的平衡因子為-2,並且其右子樹的平衡因子為1,一次左旋操作即可重新達到平衡。
  6. L1雙旋轉:刪除的是A左子樹的結點,刪除後A的平衡因子為-2,並且其右子樹的平衡因子為-1,因為刪除後A和B的平衡因子符號不同,所以需要兩次旋轉才能重新達到平衡。

下面的圖描述了對R型不平衡的處理: