小女也爱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.
小女总结:数据结构就是内功心法.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验