二叉平衡樹(AVL樹)及相關平衡操做

在講到集合的時候,很容易讓人想到的是數組和鏈表。而後你們會討論這兩種數據結構的差別。可是根據指定的內容在集合中查找,這兩種數據結構的性能卻沒有區別都是O(n),如何提升在集合中檢索指定內容數據的性能,是咱們在程序開發中面臨的問題。算法

平衡二叉樹(AVL樹)

經過二叉排序樹及相關操做說明咱們能夠總結二叉排序樹的形狀是由根節點的值決定的,若是在極端狀況下,根節點的值取的足夠小,容易退化成鏈表,致使查詢時間複雜度升高,查詢性能降低。
圖片描述
所以在二叉排序樹的基礎上具備如下性質的二叉排序樹稱爲二叉平衡樹
segmentfault

  1. 左右子樹的深度絕對值不超過1
  2. 左右子樹分別都是平衡二叉樹

術語說明及圖例

AVL樹最明顯的特色是根據其特性能進行旋轉,可是在描述旋轉的時候,一些術語比較晦澀難懂,因此對一些術語進行了圖形描述
數組

  1. 根節點的左子樹的根節點的左子樹
    圖片描述
  2. 根節點的左子樹的根節點的右子樹
    圖片描述
  3. 根節點的右子樹的根節點的左子樹
    圖片描述
  4. 根節點的右子樹的根節點的右子樹
    圖片描述

樹的深度

樹中結點的最大層次結點爲樹的深度數據結構

平衡因子

Balance Factory=> BF定義爲該結點的左子樹的深度減去該結點的右子樹的深度,則平衡二叉樹上全部結點的平衡因子只多是-一、0、1。只要二叉樹上的一個節點的平衡因子的絕對值大於1,則該二叉樹就是不平衡的。性能

平衡二叉樹(AVL樹)的旋轉

AVL樹的插入操做和刪除操做都有可能形成AVL二叉樹失去其原有的特性,爲此須要進行旋轉操做使AVL樹再平衡
說明:爲了對比平衡二叉樹旋轉先後的變化,我沒有作節點名稱的變化spa

  1. 單向右旋平衡處理

    在平衡二叉樹的根節點的左子樹的根節點的左子樹上插入一個節點致使二叉樹失去平衡,進行的單向右旋平衡處理,操做如圖所示:
    圖片描述排序

  2. 單向左旋平衡處理

    在平衡二叉樹的根節點的右子樹的根節點的右子樹上插入一個節點致使平衡二叉樹失去平衡,進行的單向左旋平衡處理,操做如圖所示:
    圖片描述圖片

  3. 雙向旋轉,先左旋後右旋平衡處理

    在平衡二叉樹的根節點的左子樹的根節點的右子樹上插入一個節點致使平衡二叉樹失去平衡,進行的雙向旋轉處理,操做如圖所示:
    圖片描述開發

  4. 雙向旋轉,先右旋再左旋平衡處理

    在平衡的二叉樹的根節點的右子樹的根節點的左子樹上插入一個節點致使平衡二叉樹失去平衡,進行的雙向旋轉處理,操做如圖所示:
    圖片描述get

AVL樹旋轉總結

  • 在平衡的二叉排序樹BBST(Balance Binary Sorted Tree)上插入一個新的數據元素e,平衡算法可描述以下:

    1. 若BBST是空樹,則插入一個數據元素e的新結點做爲BBST的根節點,樹的深度增長1;
    2. 若數據元素e的關鍵字和BBST樹的根結點的關鍵字相等,則查找成功,不進行插入操做;
    3. 若數據元素e的關鍵字小於BBST樹的根節點的關鍵字,並且在BBST的左子樹中不存在和數據元素e的關鍵字相同的關鍵字,則將e插入BBST的左子樹上,若插入新元素以後的左子樹的深度增長(+1)時,須要分狀況討論:

      • 若BBST的左子樹的根結點的平衡因子爲1,那麼就進行單向右旋進行平衡處理,而且單向右旋處理後,將修改BBST樹的根結點及根結點的左右子樹根結點的平衡因子,BBST樹的深度保持不變;
      • 若BBST的左子樹的根結點的平衡因子爲-1,那麼就進行雙向旋轉,先左旋再右旋平衡處理,而且旋轉平衡處理以後修改BBST根結點及根結點左右子樹的根結點的平衡因子,樹的深度保持不變;
    4. 若數據元素e的關鍵字大於BBST樹的根結點的關鍵字,並且在BBST的右子樹中不存在和數據元素e的關鍵字相同的關鍵字,則將e插入到BBST樹的右子樹上,參照第3步操做,分狀況進行討論針對不一樣狀況進行單向左旋平衡處理、雙向選裝,先右旋再左旋平衡處理。
  • 當平衡二叉排序樹失去平衡時,僅須要對平衡因子絕對值大於1的結點爲根節點的樹進行調整便可,且調整之後二叉排序樹的深度保持不變。
相關文章
相關標籤/搜索