小女也爱C#(5)---程序员内功心法数据结构(完全平衡二叉树)
小女最近到看数据结构(完全平衡二叉树)心有所想,如果计算机比喻成一门武学,那么数据结构就是内功心法,招式有可以千变万化,只有内功心法可以不变,以不变应万变,是武学的最高境界(引自马老师内功心法总决式).哈哈小女也是个爱看武侠的影迷.好久没写笔记了,出来写写文章,马老师说内功越高穿透力越强.洪七公教郭靖降龙十八掌,郭靖刚开始用树练掌,洪七公说先用掌把树打到动,郭靖苦练,把树打动了,洪七公又说把树打到不动,郭靖不解。洪七公解答:把掌力集中到一点上就可把树打到不动了。小女最近闭关练习内功(数据结构)小有成果,终于把树打穿,于是决定出关放松写文章.请看小女是怎么把树打穿的!
完全平衡二叉树是由排序数旋转平衡得到的,那么平衡关键是高度差值决定排序数是否旋转下面开始先看看完全平衡二叉树的高度差值由什么决定的:
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.
小女总结:数据结构就是内功心法.