數據結構---二叉樹(2)---平衡二叉樹(1)

0.簡介

本次我來簡單做一個平衡二叉樹的推導,意在瞭解平衡二叉樹的旋轉方法是怎麼來的,還有就是我記不住LL,RR這都是啥意思,所以決定找個好理解的方法,應該說是我能理解的方法。

1.平衡二叉樹

平衡二叉樹有個規則,首先是有序,然後就是一個節點的左右子樹的高度差不能超過1。

也就是差是2以及以上就是不平衡了,因爲平衡二叉樹是時刻都在調整平衡,所以差頂多就是2了。來看一下不平衡的情況是什麼。下面採用手繪圖來表達。

不平衡情況

上圖中我們不難看出,這種情況是不平衡情況,相對的還可以是右子樹深左子樹淺,這裏就只拿這一個方向做例子。

向下分解

上圖中,我將原本的1分解成了2和3兩個圖,就是圖中的圈2和圈3,後面對於圖序號不在重複說明。然後2圖分解成4圖,圖3分解成圖5。

接下來我們只看圖4和圖5,這裏的分解就是將長方體裏的節點拿出來一個給畫成樹的圓圈了,這樣看起來更直觀一些,你可能會好奇,爲什麼圖4和圖5的C節點下是一個m和m-1層數的,難道沒有兩個子樹都是m層的情況嗎?當然沒有了 ,因爲平衡二叉樹在插入節點不平衡之前是平衡的,也就是說,是從兩個子樹都是m-1層變換到一個m層一個m-1層。所以是不可能出現C節點下兩個子樹都是m層。

解決了前面的疑問後,我們先看圖4。導致數不平衡主要關注點就是圖深色的兩個子樹。正是因爲這兩個子樹造成的差值超過了1,所以樹不符合平衡規則。對於圖4來說,可以把A節點的右子樹降低,來減少差值。

調整樹

上圖中,我們將A節點降低,所以先將A節點從樹上拿下來,如圖4-1,然後將B的右子樹接到A節點的左邊,爲什麼可以這麼做?因爲B的右子樹的值全部都符合A左子樹值的要求,所以B的右子樹可以直接當做A的左子樹,這裏就不詳細解釋了。然後再將A接在B的右子樹上,這裏也很顯然了,這樣既能保證把A降低,同時還能讓節點的大小關係正確。

但是有個問題?爲什麼不能從升高C節點的角度來考慮,因爲C的兩個子樹對於都是C節點來說,都是滿足平衡條件的,嘗試一下就可以發現問題,如下圖。

樹調整

我們看圖4-4和圖4-5,在圖4-5中C節點竟然沒地方放了!所以我們才使用降低A節點。這裏再深走一步,爲什麼降低A節點的時候,A是有地方放的?因爲A從樹上拿下來來時候,A左子樹有了空位,將B的右子樹接上之後,空位跑到了B的右子樹位置,所以A有地方放。而4-5中,將C的左子樹接在B上後,留下的空位還是C自身的右子樹,空位出現在了自身下,C不能接在自己的右子樹上。

接下來我們看一下在代碼層面上如何換位置,其實在實際上,這種情況不必非要展開到圖4,因爲只和A,B節點相關,所以可以不用展開到C就能操作。

具體操作

具體操作如上圖所示。

2.備註

圖5情況請看下一篇。

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