前面我寫了一篇二叉排序樹,最後我們提到提高二叉排序樹的查找效率是讓二叉樹的形狀均衡,所以就引入了平衡二叉樹。
特點:
一種特殊類型的二叉排序樹
所有結點的左、右子樹深度之差的絕對值≤1
左右子樹是平衡二叉樹;
平衡因子:該結點左子樹和右子數的高度差
任意一個結點的平衡因子只能取:-1、0或1;如果樹中任意一個結點的平衡因子的絕對值大於1,則這棵二叉樹就失去平衡,不再是AVL樹;
對於一棵有n個結點的AVL樹,其高度保持在O(log2n)數量級,ASL也保持在O(log2n)量級。
如果在一棵AVL樹中插入一個新結點,就有可能造成失衡,此時必須重新調整樹的結構,使之恢復平衡。我們稱調整平衡過程爲平衡旋轉。
調整方法:找到最小不平衡子樹,可將重新平衡的範圍侷限於這棵子樹,在保持二叉排序樹特性的前提下,調整最小不平衡子樹中各個結點之間的鏈接關係,進行相應的旋轉,使之成爲新的平衡子樹。
最小不平衡子樹:離插入結點最近且平衡因子絕對值超過1的祖先結點,以該結點爲根的子樹稱爲最小不平衡子樹。
假設最小不平衡子樹的根結點爲A,則失去平衡後進行調整的規律可歸納爲以下四種情況。
LL平衡旋轉
RR平衡旋轉
LR平衡旋轉
RL平衡旋轉
1)LL平衡旋轉:
若在A的左子樹的左子樹插入結點,使A的平衡因子從1增加到2,需要進行一次向右順時針旋轉。(以B爲旋轉軸)
2)RR平衡旋轉:
若在A的右子樹上插入結點,使A的平衡因子從-1
增加至-2,需要進行一次逆時針旋轉。(以B爲旋轉軸)
3)LR平衡旋轉:
若在A的左子樹的右子樹上插入結點,使A的平衡因子從1增加到2,需要先進行逆時針旋轉,再順時針旋轉。(以插入的結點C爲旋轉軸)
4)RL平衡旋轉:
若在A的 右子樹的左子樹上插入結點,使A的平衡因子從-1增加到-2,則需要先進行順時針旋轉,再進行逆時針旋轉。(以插入的結點C爲旋轉軸)