1、概念
平衡二叉樹又稱AVL樹,是一種特殊的二叉排序樹。其左右子樹都是平衡二叉樹,且左右子樹高度之差的絕對值不超過1。一句話表述為:以樹中所有結(jié)點為根的左右子樹的高度之差的絕對值不超過1。為了判斷一棵二叉排序樹是否是平衡二叉樹,引進(jìn)了平衡因子的概念。平衡隱私是針對樹中的結(jié)點來說的,一個結(jié)點的平衡因子為其左子樹的高度減去右子樹高度的差,對于平衡二叉樹,樹中的所有結(jié)點的平衡因子的取值只能是-1,0,1三個值。
2、平衡二叉樹的建立
建立平衡二叉樹的過程和建立二叉排序樹的過程基本一樣,都是將關(guān)鍵字逐個插入空樹中的過程。所不同的是,在建立平衡二叉樹的過程中,每插入一個新的關(guān)鍵字都要進(jìn)行檢查,看是否新關(guān)鍵字的插入會使得原平衡二叉樹失去平衡,即樹中出現(xiàn)平衡因子絕對值大于1的結(jié)點。如果失去平衡則需要進(jìn)行平衡調(diào)整。
3、平衡調(diào)整
假定向平衡二叉樹中插入一個新結(jié)點后破壞了平衡二叉樹的平衡性,首先要找出插入新結(jié)點后失去平衡的最小子樹,然后再調(diào)整這個子樹,使之成為平衡子樹。值得注意的是,當(dāng)失去平衡的最小子樹碑調(diào)整為平衡子樹后,無需調(diào)整原有其他所有不平衡子樹,整個二叉排序樹就會成為一棵平衡二叉樹。所謂失去平衡的最小子樹是以距離插入結(jié)點最近,且平衡因子絕對值大于1的結(jié)點作為根的子樹。平衡調(diào)整有4種情況,分別為LL型,RR型,LR型和RL型。
4、一個例子
以關(guān)鍵字序列{16,3,7,11,9,26,18,14,15}構(gòu)造一棵AVL樹。
(1)先插入16,再插入3,再插入7,至此得到下圖:
(2)可以看到此時這棵樹已經(jīng)不平衡了,所以需要對此調(diào)整。此時失去平衡的最小子樹根結(jié)點為16,進(jìn)行平衡調(diào)整,將7作為根結(jié)點,3和16分別作為其左右孩子,這樣仍能保持跟大于左小于右的特性,這里進(jìn)行的是LR調(diào)整。
(3)再插入下一個結(jié)點11,插入結(jié)點9,得到下圖:
(4)可以看到此時這棵樹已經(jīng)不平衡了,所以需要對此調(diào)整。此處失去平衡的最小子樹根結(jié)點為16,這里進(jìn)行LL調(diào)整,結(jié)果如下:
(5)繼續(xù)插入26,得到:
(6)可以看到此時這棵樹已經(jīng)不平衡了,所以需要對此調(diào)整。此時失去平衡的最小子樹根結(jié)點為7,調(diào)整如下,這里進(jìn)行的是RR調(diào)整。
(7)然后插入18,同樣得到一顆不平衡的樹:
(8)因此需要對其進(jìn)行調(diào)整,此時進(jìn)行的是RL調(diào)整
(9)然后插入14、15,得到圖如下:
(10)分析上圖的不平衡,再進(jìn)行LR調(diào)整,得到下圖。
(11)至此,得到了本文最開始的高度平衡的二叉樹,也即AVL樹。