【數據結構與算法】 通俗易懂講解 AVL樹

AVL樹是一種特殊的二叉搜索樹,所以若是你對二叉搜索樹不熟悉,建議看完下面幾篇二叉搜索樹的文章再來學習AVL樹,這樣更容易理解。算法

通俗易懂講解 二叉搜索樹
通俗易懂講解 二叉樹遍歷
通俗易懂講解 二叉搜索樹查找
通俗易懂講解 二叉搜索樹插入刪除服務器

二叉搜索樹的侷限

咱們已經知道,通常狀況二叉搜索樹的查找效率爲log(n),已經足夠好了。可是這裏爲何強調是通常狀況呢?是由於,對於一樣的節點,插入的順序不一樣,最後獲得的二叉搜索樹的結構也不同,對於(2,3,4,5,6,7,8)序列,能夠構成下面這樣的一顆二叉搜索樹:
【數據結構與算法】 通俗易懂講解 AVL樹
仍是(2,3,4,5,6,7,8)序列,它也能構成下面這樣的二叉搜索樹,準確的說它應該是一個單鏈表了,對於單鏈表,咱們很清楚,它的查找操做時間複雜度爲n。
【數據結構與算法】 通俗易懂講解 AVL樹
n和log(n)的時間複雜度意味什麼?從下面的圖能夠看到,隨着元素的增長,log(n)的時間複雜度的增加要遠小於n。所以咱們天然但願二叉搜索樹能儘量保持log(n)的深度。所以,本文的主人公AVL樹橫空出世了。
【數據結構與算法】 通俗易懂講解 AVL樹數據結構

什麼是AVL樹

AVL樹,是一種平衡(balanced)的二叉搜索樹。由兩位科學家在1962年發表的論文《An algorithm for the organization of information》當中提出,做者是發明者G.M. Adelson-Velsky和E.M. Landis。ide

相比於"二叉查找樹",AVL樹的特色是:AVL樹中任何節點的兩個子樹的高度最大差異爲1。 關於樹的高度等基本概念,請參考前面文章通俗易懂講解 二叉搜索樹(請戳我)
【數據結構與算法】 通俗易懂講解 AVL樹
上面圖中,左邊的是AVL樹,它的任何節點的兩個子樹的高度差異都<=1;而右邊的不是AVL樹,由於7的兩顆子樹的高度相差爲2(以2爲根節點的樹的高度是3,而以8爲根節點的樹的高度是1)。學習

關於AVL樹的操做,大部分都能複用平衡二叉樹樹的操做,可是對於插入和刪除操做來講,極可能因爲節點的插入和刪除致使AVL樹的平衡狀態就被破壞,因此咱們須要一種機制來檢測這棵樹是否平衡,以及當它不平衡的時候,咱們應該經過某些操做使它從新平衡(rebalanced)。orm

旋轉

前面講到若是在AVL樹中進行插入一個新的節點或刪除某個節點後,可能致使AVL樹失去平衡。這種失去平衡的能夠歸納爲4種姿態:LL(左左),LR(左右),RR(右右)和RL(右左)。下面給出它們的示意圖:
【數據結構與算法】 通俗易懂講解 AVL樹
上圖中的4棵樹都是"失去平衡的AVL樹",從左往右的狀況依次是:LL、LR、RL、RR。除了上面的狀況以外,還有其它的失去平衡的AVL樹,以下圖:
【數據結構與算法】 通俗易懂講解 AVL樹
上面的兩張圖都是爲了便於理解,而列舉的關於"失去平衡的AVL樹"的例子。總的來講,AVL樹失去平衡時的狀況必定是LL、LR、RL、RR這4種之一,它們都由各自的定義:視頻

LL:稱爲"左左"。插入或刪除一個節點後,根節點的左子樹的左子樹還有非空子節點,致使"根的左子樹的高度"比"根的右子樹的高度"大2,致使AVL樹失去了平衡。blog

示例:上面LL狀況中,因爲"根節點(8)的左子樹(4)的左子樹(2)還有非空子節點",而"根節點(8)的右子樹(12)沒有子節點";致使"根節點(8)的左子樹(4)高度"比"根節點(8)的右子樹(12)"高2。it

LR:稱爲"左右"。插入或刪除一個節點後,根節點的左子樹的右子樹還有非空子節點,致使"根的左子樹的高度"比"根的右子樹的高度"大2,致使AVL樹失去了平衡。io

示例:上面LR狀況中,因爲"根節點(8)的左子樹(4)的左子樹(6)還有非空子節點",而"根節點(8)的右子樹(12)沒有子節點";致使"根節點(8)的左子樹(4)高度"比"根節點(8)的右子樹(12)"高2。

RL:稱爲"右左"。插入或刪除一個節點後,根節點的右子樹的左子樹還有非空子節點,致使"根的右子樹的高度"比"根的左子樹的高度"大2,致使AVL樹失去了平衡。

示例:上面RL狀況中,因爲"根節點(8)的右子樹(12)的左子樹(10)還有非空子節點",而"根節點(8)的左子樹(4)沒有子節點";致使"根節點(8)的右子樹(12)高度"比"根節點(8)的左子樹(4)"高2。

RR:稱爲"右右"。插入或刪除一個節點後,根節點的右子樹的右子樹還有非空子節點,致使"根的右子樹的高度"比"根的左子樹的高度"大2,致使AVL樹失去了平衡。

示例:上面RR狀況中,因爲"根節點(8)的右子樹(12)的右子樹(14)還有非空子節點",而"根節點(8)的左子樹(4)沒有子節點";致使"根節點(8)的右子樹(12)高度"比"根節點(8)的左子樹(4)"高2。

前面講過在AVL樹不平衡的時候,咱們應該經過某些操做使它從新平衡,後面將會單獨用一篇文章總結"LL(左左),LR(左右),RR(右右)和RL(右左)"這4種狀況對應的旋轉方法。

推薦閱讀:

精心整理 | 歷史乾貨文章目錄
【福利】本身蒐集的網上精品課程視頻分享(上)
【數據結構與算法】 通俗易懂講解 二叉樹遍歷
【數據結構與算法】 通俗易懂講解 二叉搜索樹

專一服務器後臺技術棧知識總結分享

歡迎關注交流共同進步

【數據結構與算法】 通俗易懂講解 AVL樹

碼農有道 coding

碼農有道,爲您提供通俗易懂的技術文章,讓技術變的更簡單!

相關文章
相關標籤/搜索