平衡二叉樹


更新、更全的《數據結構與算法》的更新網站,更有python、go、人工智能教學等着你:https://www.cnblogs.com/nickchen121/p/11407287.html

一、什么是平衡二叉樹

例:搜索樹結點不同插入次序,將導致不同的深度和平均查找長度ASL

上圖為按照自然月份序列構建的搜索樹,它的ASL為\((1+2*2+3*3+4*3+5*2+6*1)/12=3.5\)

上圖為按照平衡二叉樹構建的搜索樹,它的ASL為\(3.0\)

上圖為按照月份字符串大小順序構建的搜索樹,他的ASL為\(6.5\)

“平衡因子”(Balance Factor,簡稱BF): \(BF(T) = h_L - h_R\),其中\(h_L\)\(h_R\)分別為T的左、右子樹的高度。

平衡二叉樹(Balanced Binary Tree)(AVL樹):空樹,或者任一結點左、右子樹高度差的絕對值不超過1,即\(BF(T)|\leq{1}\)

二、平衡二叉樹的高度能達到\(log_2n\)嗎?

如下圖所示為完全二叉樹的高度計算:

\(n_h\)為高度為h的平衡二叉樹的最少結點數。結點數最少時,我們可以得知左(右)子樹最多比右(左)子樹多一個結點:

上述公式類似於斐波那契序列: \(F_0=1,F_1=1,F_i=F_{i-1}+F_{i-2}\quad{f}or\quad{i}>1\),即我們可以通過斐波那契的規律,來探討平衡二叉樹的高度計算。

\(n_h\)是高度為h的平衡二叉樹的最小結點數,有如下推導:

按照上圖的推導,我們可以得出:給定結點數為n的AVL樹的最大高度為\(O(log_2n)\)

三、平衡二叉樹的調整

3.1 右單旋

不平衡的“發現者”是Mar,“麻煩結點”Nov在發現者子樹的右邊,因而叫做RR插入,需要RR旋轉(右單旋)

3.2 左單旋

“發現者”是Mar,“麻煩結點”Apr在發現者子樹的左邊,因而叫LL插入,需要LL旋轉(左單旋)

3.3 左-右雙旋

“發現者”是May,“麻煩結點”Jan在子樹的右邊,因而叫LR插入,需要LR旋轉

3.4 右-左雙旋

“發現者”是Aug,“麻煩結點”是Feb在子樹的左邊,因而叫RL插入,需要LR旋轉

3.5 完善平衡二叉樹

接下來我們使用上述所說的四種方法,完善我們的平衡二叉樹。

調整后的結果為:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM