平衡二叉樹

更新、更全的《數據結構與算法》的更新網站,更有python、go、人工智能教學等着你:http://www.javashuo.com/article/p-zfinzipt-hh.htmlpython

1、什麼是平衡二叉樹

例:搜索樹結點不一樣插入次序,將致使不一樣的深度和平均查找長度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的左、右子樹的高度。spa

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

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

以下圖所示爲徹底二叉樹的高度計算:htm

\(n_h\)爲高度爲h的平衡二叉樹的最少結點數。結點數最少時,咱們能夠得知左(右)子樹最多比右(左)子樹多一個結點:blog

上述公式相似於斐波那契序列: \(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、平衡二叉樹的調整

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 完善平衡二叉樹

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

調整後的結果爲:

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息