1. AVL定義

AVL樹是一種改進(jìn)版的搜索二叉樹。對于一般的搜索二叉樹而言,如果數(shù)據(jù)恰好是按照從小到大的順序或者從大到小的順序插入的,那么搜索二叉樹就對退化成鏈表,這個(gè)時(shí)候查找,插入和刪除的時(shí)間都會(huì)上升到O(n),而這對于海量數(shù)據(jù)而言,是我們無法忍受的。即使是一顆由完全隨機(jī)的數(shù)據(jù)構(gòu)造成的搜索二叉樹,從統(tǒng)計(jì)角度去分析,在進(jìn)行若甘次的插入和刪除操作,這個(gè)搜索二叉樹的高度也不能令人滿意。這個(gè)時(shí)候大家就希望能有一種二叉樹解決上述問題。這個(gè)時(shí)候就出現(xiàn)平衡搜索二叉樹,它的基本原理就是在插入和刪除的時(shí)候,根據(jù)情況進(jìn)行調(diào)整,以降低二叉樹的高度。平衡搜索二叉樹典型代表就是AVL樹和紅黑樹。

AVL樹:任何一個(gè)節(jié)點(diǎn)的左子支高度與右子支高度之差的絕對值不超過1。需要我們注意的是,AVL樹定義不是說從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的最短距離比最長短距離大1。

image

上圖就是一顆AVL樹,從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的最短距離是5,最長距離是9。

2. AVL插入操作

AVL樹的插入操作首先會(huì)按照普通搜索二叉樹的插入操作進(jìn)行,當(dāng)插入一個(gè)數(shù)據(jù)后,我們會(huì)沿著插入數(shù)據(jù)時(shí)所經(jīng)過的的節(jié)點(diǎn)回溯,回溯的過程中會(huì)判回溯路徑中的每個(gè)節(jié)點(diǎn)的左子支高度與右子支高度之差的絕對值是否超過1,如果超過1我們就進(jìn)行調(diào)整,調(diào)整的目的是使得該節(jié)點(diǎn)滿足AVL樹的定義。調(diào)整的情況可以分為以下四旋轉(zhuǎn)操作,旋轉(zhuǎn)操作可以降低樹的高度,同時(shí)不改變搜索二叉樹的性質(zhì)(即任何一個(gè)節(jié)點(diǎn)左子支中的全部節(jié)點(diǎn)小于該節(jié)點(diǎn),右子支的全部節(jié)點(diǎn)大于該節(jié)點(diǎn))。

2.1 情況1,節(jié)點(diǎn)D左子支比右子支高度大2,且插入的節(jié)點(diǎn)位于D的左孩子節(jié)點(diǎn)的左子支上

image

2.2 情況2,節(jié)點(diǎn)D右子支比左子支高度大2,且插入的節(jié)點(diǎn)位于節(jié)點(diǎn)D右孩子節(jié)點(diǎn)的右子支上

image

2.3 情況3,節(jié)點(diǎn)D左子支比右子支高度大2,且插入的節(jié)點(diǎn)位于節(jié)點(diǎn)D左孩子節(jié)點(diǎn)的右子支上

image

2.4 情況4, 節(jié)點(diǎn)D右子支比左子支高度大2,且插入的節(jié)點(diǎn)位于節(jié)點(diǎn)D右孩子節(jié)點(diǎn)的左子支上

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式