目錄html
更新、更全的《數據結構與算法》的更新網站,更有python、go、人工智能教學等着你:http://www.javashuo.com/article/p-zfinzipt-hh.htmlpython
例:搜索樹結點不一樣插入次序,將致使不一樣的深度和平均查找長度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
以下圖所示爲徹底二叉樹的高度計算: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)\)
不平衡的「發現者」是Mar,「麻煩結點」Nov在發現者右子樹的右邊,於是叫作RR插入,須要RR旋轉(右單旋)
「發現者」是Mar,「麻煩結點」Apr在發現者左子樹的左邊,於是叫LL插入,須要LL旋轉(左單旋)
「發現者」是May,「麻煩結點」Jan在左子樹的右邊,於是叫LR插入,須要LR旋轉
「發現者」是Aug,「麻煩結點」是Feb在右子樹的左邊,於是叫RL插入,須要LR旋轉
接下來咱們使用上述所說的四種方法,完善咱們的平衡二叉樹。
調整後的結果爲: