splay的基本操作及相关例题 未完待续

文章参考《神奇的splay》

1.splay介绍

splay是一种非严格维护的平衡二叉树,每次操作的均摊复杂度为O(logN)。此外,splay编程复杂度低,支持的操作很多。

2.splay基本操作

①:旋转

经典旋转:左旋zag,右旋zig,如下图

]

②:伸展

六种操作:ZIG-ZAG,ZIG-ZIG,ZAG-ZIG-ZAG-ZAG.ZIG,ZAG,全是zig和zag的组合操作。

考虑需要将x结点伸展到根的操作。

第一种情况:如果x结点的父亲y已经是根结点,我们只需要简单的对它做ZIGZAG的操作,它就会被伸展到根,如图1所示。

第二种情况:如果x结点的父亲y不是根结点,设y结点的父亲为z。若yz的左孩子,且xy的左孩子,则我们进行ZIG-ZIG操作;若yz的右孩子,且xy的右孩子,则我们进行ZAG-ZAG操作。

ZIG-ZIG为例,我们需要做的只是将y结点先ZIG,再将x结点ZIG。很显然这样x结点就会替代原先z结点的位置。实际上,ZIG-ZIG操作之后结点的位置变化如下图


2 ZIG-ZIG操作

ZAG-ZAG操作类似。

第三种情况:如果x结点的父亲y不是根结点,设y结点的父亲为z。若yz的左孩子,且xy的右孩子,则我们进行ZAG-ZIG操作;若yz的右孩子,且xy的左孩子,则我们进行ZIG-ZAG操作。

对于ZIG-ZAG操作,和ZIG-ZIG有所不同——它需要先把x结点右旋,再把y结点左旋。

旋转后结点变化如下图

其实,基本上自己画个图就能看出来伸展操作了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值