1. 程式人生 > >數據結構(三十八)平衡二叉樹(AVL樹)

數據結構(三十八)平衡二叉樹(AVL樹)

圖1 建立 滿足 技術分享 factor 這也 絕對值 因此 調整

  一、平衡二叉樹的定義

  平衡二叉樹(Self-Balancing Binary Search Tree或Height-Balanced Binary Search Tree),是一種二叉排序樹,其中每一個結點的左子樹和右子樹的高度差至多等於1。平衡二叉樹是一種高度平衡的二叉排序樹,即要麽是一棵空樹,要麽它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1。

  將二叉樹上結點的左子樹深度減去右子樹深度的值稱為平衡因子BF(Balance Factor),那麽平衡二叉樹上所有結點的平衡因子只可能是-1、0和1。

  距離插入結點最近的,且平衡因子的絕對值大於1的結點為根的子樹,稱為最小不平衡樹。

  

  二、平衡二叉樹的實現原理

  平衡二叉樹構建的基本思想就是在構建二叉排序樹的過程中,每當插入一個結點時,先檢查是否因插入破壞了樹的平衡性,若是,則找出最小不平衡樹。在保持二叉排序樹特性的前提下,調整最小不平衡樹中各結點之間的鏈接關系,進行相應的旋轉,使之成為新的平衡子樹。

  以數組{3,2,1,4,5,6,7,10,9,8}為例:

  技術分享圖片技術分享圖片技術分享圖片

  技術分享圖片技術分享圖片技術分享圖片

  技術分享圖片技術分享圖片

  註意的是:

  • 圖6到圖7,對結點2進行左旋,本來結點3是結點4的左孩子,由於旋轉後需要滿足二叉排序樹的特定,因此結點3最後成了結點2的右孩子。
  • 另外,圖11中, 如果對結點7進行左旋的話,結點9就成了結點10的右孩子了,這也是不滿足二叉排序樹的,根本原因在於結點7的BF值為-2,二結點10的BF值為1,符號並不統一,因此不能直接旋轉,所以需要首先把結點10進行右旋,結點10就成了結點9的右孩子,而此時結點7和結點9的符號也統一了,所以以結點7為根進行左旋,最後得到圖13。
  • 圖14中同理,結點6的BF值為-2,而結點9的BF為1,所以要先以9為根結點右旋,得到圖15,然後,此時結點6和結點7的BF值都為負,然後進行左旋即可。

  

  三、平衡二叉排序樹的實現

  1.在平衡二叉排序樹T上插入一個新紀錄x的算法描述:

  • 若AVL為空樹,則插入一個記錄為x的新結點作為T的根結點,樹的深度增1
  • 若x的關鍵字值和AVL樹T的根結點的關鍵字值相等,則不進行插入操作
  • 若x的關鍵字值小於AVL樹的根結點的關鍵字值,則將x插入在概述的左子樹上,並且當插入之後的左子樹深度增加1時,分別就下列不同情況進行處理:

  ①若AVL樹的根結點的平衡因子為-1(右子樹的深度大於左子樹的深度),則將根結點的平衡因子調整為0,並且樹的深度不變。

  ②若AVL樹的根結點的平衡因子為0(左右子樹的深度相等),則將根結點的平衡因子調整為1,樹的深度同時增加1

  ③若AVL樹的根結點的平衡因子為1(左子樹的深度大於右子樹的深度),則當該樹的左子樹的根結點的平衡因子為1時需要進行單向右旋;當該樹的左子樹的根結點的平衡因子為-1時需進行先左旋後右旋。

  • 若x的關鍵字值大於AVL樹的根結點的關鍵字值,則將x插入在該樹的右子樹上,並且當插入之後的右子樹深度增加1時,分別就不同情況進行處理,同理第三步。

  

  四、平衡二叉排序樹的時間復雜度

  平衡二叉排序樹使得二叉樹排序樹的結構更好,從而提高了查找操作的速度。但是使得插入和刪除操作復雜化,從而降低了插入和刪除操作的速度。因此,平衡二叉樹適合於二叉排序樹一經建立就很少進行插入和刪除操作,而主要是進行查找操作的應用場合中。

  由於平衡二叉樹在查找過程中和給定值進行比較的關鍵字個數不超過樹的深度,因此,在平衡二叉樹上進行查找的時間復雜度為O(logn)。

數據結構(三十八)平衡二叉樹(AVL樹)