再回首數據結構—AVL樹(二)

前面主要介紹了AVL的基本概念與結構,下面開始詳細介紹AVL的實現細節;3d

AVL樹實現的關鍵點

  AVL樹與二叉搜索樹結構相似,但又有些細微的區別,從上面AVL樹的介紹咱們知道它須要維護其左右節點平衡,實現AVL樹關鍵在於標註節點高度、計算平衡因子、維護左右子樹平衡這三點,下面分別介紹;code

標註節點高度

  從上面AVL樹的定義中咱們知道AVL樹其左右節點高度差不能超過一,因此咱們須要標註出每一個節點高度;blog

  一、節點高度爲最大的子節點高度加1,其中葉子節點高度爲1;
  二、1與4葉子節點高度爲1,節點3高度爲節點4的高度加1,節點2高度爲1與3節點中最大的高度加1;
  三、節點初始化時高度爲1,當在AVL中添加與刪除節點時須要維護其節點高度,在AVL添加節點後須要從新計算當前添加節點的高度;get

計算平衡因子

  標註了每一個節點高度後此時能夠輕鬆算出每一個節點的平衡因子,只需其節點左子樹與右子樹的高度差的絕對值便可;it

  一、一、4葉子節:平衡因子爲0
  二、節點3:右子樹高度爲1,左子樹其高度爲0,0-1絕對值爲1,此節點平衡因子爲1
  三、節點2:左子樹高度爲1,右子樹高度爲2,1-2絕對值爲1,此節點平衡因子爲1class

維護左右子樹平衡

  當在AVL中添加與刪除節點時均可能形成AVL變成失去平衡狀態使之退化爲二叉搜索樹,AVL中主要在添加節點與刪除節點時須要維護其左右子樹的平衡因子;搜索

添加節點
  添加節點最終都是添加到葉子節點上,節點添加後其先祖節點可能出現了失去平衡的狀況,須要從添加的節點開始向上維護平衡性,向上查找不平衡節點;im

右旋轉
  新增節點在不平衡節點左側的左側,同時不平衡節點左子樹高度大於等於右子樹高度(左子樹平衡因子大於等於右子樹平衡因子);d3

  添加節點1後第一個不平衡節點爲節點3,同時節點3左子樹高度大於右子樹高度,此時須要不平衡節點向右旋轉;db

經過以下操做完成節點右旋轉;

T = 2.right  
 2.right = 3
 3.left = T

左旋轉
  新增節點在不平衡節點右側的右側,同時不平衡節點右子樹高度大於等於左子樹高度(右子樹平衡因子大於等於左子樹平衡因子);

添加節點3後,節點1失去平衡 添加節點3後第一個不平衡節點爲節點1,同時節點1右子樹高度大於左子樹高度,此時須要不平衡節點向左旋轉;

經過以下操做完成節點左旋轉;

T = 2.left  
 2.left = 1
 1.right = T

先左旋轉後右旋轉

新增節點在不平衡節點左側的右側

先左旋轉,變成了右旋轉問題,重複上面說所的右旋轉;

T = 4.left
 Y = T.right
 Z = Y.left  
 Y.left = T
 T.right = Z
 4.left = Y

先右旋轉後左旋轉

新增節點在不平衡節點右側的左側

先右旋轉,變成了左旋轉問題,重複上面說所的左旋轉;

T = 2.right
 Y = T.left
 Z = Y.right  
 Y.right = T
 T.left = Z
 2.right = Y

刪除節點

  刪除節點是AVL樹也可能會失去平衡,所以也須要維護AVL的平衡性;
節點的刪除右這麼幾個步驟:
一、 要刪除的節點比當前節點小時在左子樹查找
二、 要刪除的節點比當前節點大時在右子樹查找
三、 要刪除節點爲當前節點且左子樹爲空時右子樹頂上
四、 要刪除節點爲當前節點且右子樹爲空時左子樹頂上
五、 要刪除節點左右子樹均存在時,大於當前節點的最小節點頂上
六、 更新節點高度值
七、 計算節點平衡因子
八、 進行與添加節點時同樣的平衡因子維護操做

文章首發地址:Solinx
http://www.solinx.co/archives/1330

相關文章
相關標籤/搜索