天天看點

二叉排序樹

一、定義

二叉排序樹(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