小女最近到看數據結構(完全平衡二叉樹)心有所想,如果計算機比喻成一門武學,那么數據結構就是內功心法,招式有可以千變萬化,只有內功心法可以不變,以不變應萬變,是武學的最高境界(引自馬老師內功心法總決式).哈哈小女也是個愛看武俠的影迷.好久沒寫筆記了,出來寫寫文章,馬老師說內功越高穿透力越強.洪七公教郭靖降龍十八掌,郭靖剛開始用樹練掌,洪七公說先用掌把樹打到動,郭靖苦練,把樹打動了,洪七公又說把樹打到不動,郭靖不解。洪七公解答:把掌力集中到一點上就可把樹打到不動了。小女最近閉關練習內功(數據結構)小有成果,終於把樹打穿,於是決定出關放松寫文章.請看小女是怎么把樹打穿的!
完全平衡二叉樹是由排序數旋轉平衡得到的,那么平衡關鍵是高度差值決定排序數是否旋轉下面開始先看看完全平衡二叉樹的高度差值由什么決定的:
p p
K1 D K2 D
A K2 k1 C
B C A B
圖1 圖2
圖1 為一棵avl樹,圖2為avl樹旋轉后得到
詞說明:TPOld(原來P結點的高度差值),TPNew(新的P結點的高度差值),hd(d結點的高度)
已知 TPOld = (1+max(ha,(1+max(hb,hc))))-hd
未知 TPNew = (1+max(hc,(1+max(ha,hb))))-hd
已知 TK1 = ha - (1+ max(hb,hc))
未知 TK1New = ha - hb
已知 TK2 = hb - hc
未知 TK2New = (1+max(ha,hb))-hc
因為TK2=hb - hc
所以 hb=Tk2+hc
因為TK1=ha - (1+ max(hb,hc))
所以 ha=TK1+(1+ max(Tk2+hc,hc))
TK1New = ha - hb = (TK1+(1+ max(Tk2+hc,hc))) - (Tk2+hc)
TK2New =(1+max(ha,hb))-hc
= (1+max((TK1+(1+ max(Tk2+hc,hc))),(Tk2+hc)))-hc
TPNew-TPOld
= max(hc,(1+max(ha,hb))) - max(ha,(1+max(hb,hc)))
=
max(hc,(1+max((TK1+(1+ max(Tk2+hc,hc))),(Tk2+hc))))
- max((TK1+(1+ max(Tk2+hc,hc))),(1+max((Tk2+hc),hc)))
所以:變化值 和K1,K2高度差數值有關 與樹高度無關
如:排序數值 10,5,20,3,1
avl樹插入變化如下:T代表高度差
10 => 10 (高度差為1) => 10 (高度差為1) => 10(高度差為2) 高度差的決對值大過2所以要旋轉
5 5 20 5 (2) 20(0)括號內的值為結點高度差
1 3 (1)
1 (0)
旋轉后:
10 (高度差為1) 旋轉后的高度差的值由以上公式計算得到
3(0) 20(0)
1(0) 5(0)
設:hc=0,因為 變化值 和K1,K2高度差數值有關 與樹高度無關,所以hc是什么值都行,TK1=2,Tk2=-1,代入公式
max(hc,(1+max((TK1+(1+ max(Tk2+hc,hc))),(Tk2+hc))))- max((TK1+(1+ max(Tk2+hc,hc))),(1+max((Tk2+hc),hc)))
所以結點10變化后的高度差為1.
小女總結:數據結構就是內功心法.
