前面主要介紹了AVL的基本概念與結構,下面開始詳細介紹AVL的實現細節;3d
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的平衡性;
節點的刪除右這麼幾個步驟:
一、 要刪除的節點比當前節點小時在左子樹查找
二、 要刪除的節點比當前節點大時在右子樹查找
三、 要刪除節點爲當前節點且左子樹爲空時右子樹頂上
四、 要刪除節點爲當前節點且右子樹爲空時左子樹頂上
五、 要刪除節點左右子樹均存在時,大於當前節點的最小節點頂上
六、 更新節點高度值
七、 計算節點平衡因子
八、 進行與添加節點時同樣的平衡因子維護操做