二叉排序樹


一、定義

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM