這可能是最簡單的AVL二叉平衡查找樹講解

二叉平衡查找樹AVL詳解

看懂這篇文章所需的知識點

樹、二叉搜索樹、樹高、樹深、層等概念

AVL樹

概念任意節點的左右子樹的高度差不能大於1的樹即爲AVL樹,是爲了解決在頻繁插入刪除等動態更新下出現的時間複雜度退化的問題,所以平衡的意思爲:儘可能使整個樹保持平衡,而不會出現左子樹很高右子樹很矮的情況。

AVL樹失衡後平衡化操作分爲四種:LL、RR、RL、LR
LL的意思爲:整棵樹失衡的原因在於根節點的左節點的左節點導致的失衡,有可能是左節點的左節點本身(即一條鏈的情況)導致的失衡,或者是左節點的左節點上多添加了節點導致的失衡
其他RR、RL、LR類似

左節點的左節點本身(即一條鏈的情況)導致的失衡:
在這裏插入圖片描述
此圖中,A的左子樹樹深爲2,右子樹樹深爲0,即2-0>=2,即整體失衡,根節點爲A,此時爲LL型,即A節點的左節點(B)的左節點(C)本身導致的失衡。

左節點的左節點上多添加了節點導致的失衡

在這裏插入圖片描述
此時以A爲根節點的左子樹深度爲3,右子樹深度爲1,3-1>=2,失衡,此時也爲LL型,失衡節點爲D,因爲它加了一個F節點導致的失衡。

**那麼如何分辨LL、RR、LR、RL的L和R呢?**很簡單,根據失衡的樹中,如果左子樹深度大於右子樹深度(例如上面的LL),則該情況爲LL或LR,反之則爲RR或RL

LL型詳解

LL型分成三種情況

LL型第一種情況

先說解決方案:以根節點的左節點當做旋轉中心,將根節點右旋
在這裏插入圖片描述

這種情況因爲形成一條鏈,導致A節點的左右節點之差的絕對值大於等於2,所以需要進行平衡化操作,具體操作爲:以根節點的左節點當做旋轉中心,將根節點A右旋:
在這裏插入圖片描述

LL型的第二種情況

在這裏插入圖片描述
如何判斷是否失衡:即一個節點一個節點的左右子樹的深度來判斷,例如上圖B的左子樹深度爲2,右子樹深度爲1,此時2-1<2,平衡,當以A爲根節點時,A的左子樹深度爲3,右子樹深度爲1,失衡,所以失衡的原因在左子樹太深,即LL型或LR型(後面講),且深度爲各個節點中最大的數值

在這個圖中:導致失衡的原因爲D點上多了一個F導致的失衡(當把F去掉,整棵樹平衡),所以就需要根據LL型的解決方法來解決:將根節點根據根節點的左節點做右旋,即A根據B做右旋,其他節點的關係保持不變即:
在這裏插入圖片描述此時由於B節點有右節點,即右旋前會先將B的右節點E去掉,然後再右旋,再根據查找樹的規則將E插入到符合規則的位置,即A>E>B,此時旋轉過來後要保持A>E>B,所以只能插在A的左節點處。

LL型第三種情況

在這裏插入圖片描述
第三種情況和第二種其實是一致的,只是F點由D的左節點改成了右節點,隻影響結果中的F的位置,這裏不足贅述
在這裏插入圖片描述

RR型

跟LL型一致,RR型爲根節點的右節點的右節點導致的失衡
解決方案將根節點根據根節點的右子樹左旋

RR第一種情況

在這裏插入圖片描述
很明顯這是由於根節點的右節點的右節點本身導致的失衡,解決方案,A圍着B做左旋
在這裏插入圖片描述

RR第二種情況

在這裏插入圖片描述
和LL一樣,這裏的原因是根節點的右子樹的右子樹由於增加了一個節點F導致的失衡,解決方案:
將A圍着C左旋,這裏有D點佔了位置,此時LL一樣,先將D點移除,待左旋完成後,再根據定義插入
![在

RR第三種情況

在這裏插入圖片描述
這裏和第二種情況類似不再延伸

RL型

根據上面的講解來推理:
RL爲根節點的右節點的左節點導致的失衡
解決方法:先根據根節點的右節點根據失衡節點右旋變成RR,再根據RR的解決辦法左旋即可

RL型第一種情況

在這裏插入圖片描述
由於根節點的右節點的左節點導致的失衡,此時需要根據根節點的右節點根據失衡節點右旋,即B根據C來右旋B,即
在這裏插入圖片描述
這就變成了一個RR,後根據RR的處理方式左旋即可,所以結果爲:
在這裏插入圖片描述

RL型第二種情況

在這裏插入圖片描述

如何判斷是RR、LL、RL、LR的哪一種類型?
先找出有問題子樹,在這個圖中,A節點的左子樹的深度爲1,右子樹深度爲3,所以右子樹有問題需要平衡右子樹,即RR或RL的一種,那麼怎麼確定是哪一種?具體方法爲找到深度最深的那一條,即A-C-D-F,即是因爲此條路徑導致的不平衡,所以根據圖來看,C爲右節點,D爲左節點,所以這一種情況爲RL型,假如上圖中是E節點的路徑更長,那麼就是RR了(具體問題具體分析)

所以在這張圖中,我們需要把C根據失衡節點D點右旋,變成了RR,在左旋即可,其他未旋轉節點之間的關係保持不變
在這裏插入圖片描述

RL型第三種情況

在這裏插入圖片描述這裏和第二種情況一樣,只改變了F節點的位置,由於旋轉時會替換掉F節點,所以F節點需要先脫離,後旋轉完成(一次旋轉而不是成爲平衡)後再插入

LR型

這個就和之前的一樣了
LR爲根節點的左節點的右節點導致的失衡
解決方法:先根據根節點的左節點根據失衡節點左旋變成LL,再根據LL的解決辦法右旋即可

LR型第一種情況

在這裏插入圖片描述
先B根據A左旋,變成一個LL,再右旋
在這裏插入圖片描述

LR第二種情況

在這裏插入圖片描述這裏不需要在講解了

LR第三種情況

在這裏插入圖片描述這裏同樣不做贅述

總結

類型 操作方法
RR型 根節點根據根節點的右節點左旋
LL型 根節點根據根節點的左節點右旋
LR型 根節點的左節點根據失衡節點左旋變成LL再右旋
RL型 根節點的右節點根據失衡節點右旋變成RR再右旋

注意事項
在進行有些旋轉的時候,如果旋轉後的地方原本有節點,那麼就先將原有節點刪去,待旋轉完成後根據搜索樹的特點將其插入
假如來一張圖,該如何判斷失衡和什麼類型的失衡?
這個位圖都在上面回答了,分別在LL型第二種情況下,和RL型第二種情況下,請自行查看。

課後題

將 {12,4,1,3,7,8,10,9,2,11,6,5}組成一個AVL樹,方法爲逐個構建,然後在失衡的時候調整平衡,再添加子節點

正確答案爲
在這裏插入圖片描述

相關來源

https://www.bilibili.com/video/BV1e4411x7rZ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章