一、定義
二叉排序樹(Binary Sort Tree)又稱二叉查找樹、二叉搜索樹。 它或者是一棵空樹;或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
首先實現二叉排序樹的搜索,因為后續無論對二叉排序樹進行增加、刪除都要先進行查找。
def bst_search(btree,key): bt=btree while bt is not None: if key==bt.value: return True elif key>bt.value: bt=bt.right else: bt=bt.left return False
如果二叉樹的結構良好,其高度與樹中結點個數n成對數關系,檢索的時間開銷為O(logn),但是如果樹結構為畸形,檢索的最壞時間可能達到O(n),如下圖的樹:
但是如果是下面這樣的結構,則平均檢索時間就能達到O(logn):
從上述兩棵樹而已看出,一組有序數據,是可以構建多種不同的二叉排序樹,但是哪種才是最優的二叉排序樹呢?從上可以看出第二顆樹明顯優於第一個,第二個樹正是平衡二叉排序樹,所以平衡二叉排序樹才是最優的。
二、平衡二叉排序樹(AVL樹)
平衡二叉排序樹,又叫AVL樹,是由它們的發明者蘇聯人的名字命名的,定義如下:
平衡二叉排序樹是一類特殊的二叉排序樹,它或者為空樹,或者其左右子樹都是平衡二叉排序樹,而且其左右的子數高度之差絕對值不超過1.
AVL樹的查找平均復雜度是O(log(n))。
在每一次樹插入新元素后,樹的平衡都可能被破壞,需要旋轉調整樹的高度,以達到平衡樹結構,共分為以下四種情況:
- LL:對該結點的左兒子的左子樹進行了一次插入,需右旋轉
- LR:對該結點的左兒子的右子樹進行了一次插入,先左后右
- RL:對該結點的右兒子的左子樹進行了一次插入,先右后左
- RR:對該結點的右兒子的右子樹進行了一次插入,需左旋轉
旋轉原則:在旋轉的時候,都是要以離新插入節點最近的不平衡子樹進行旋轉,注意旋轉的這部分子樹一定是不平衡的子樹。
1)LL情況
2)RR情況
3)LR情況
4)RL情況
python代碼實現參考:https://www.cnblogs.com/linxiyue/p/3659448.html?utm_source=tuicool&utm_medium=referral