文章参考《神奇的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已经是根结点,我们只需要简单的对它做ZIG或ZAG的操作,它就会被伸展到根,如图1所示。
第二种情况:如果x结点的父亲y不是根结点,设y结点的父亲为z。若y是z的左孩子,且x是y的左孩子,则我们进行ZIG-ZIG操作;若y是z的右孩子,且x是y的右孩子,则我们进行ZAG-ZAG操作。
以ZIG-ZIG为例,我们需要做的只是将y结点先ZIG,再将x结点ZIG。很显然这样x结点就会替代原先z结点的位置。实际上,ZIG-ZIG操作之后结点的位置变化如下图:
图2 ZIG-ZIG操作
ZAG-ZAG操作类似。
第三种情况:如果x结点的父亲y不是根结点,设y结点的父亲为z。若y是z的左孩子,且x是y的右孩子,则我们进行ZAG-ZIG操作;若y是z的右孩子,且x是y的左孩子,则我们进行ZIG-ZAG操作。
对于ZIG-ZAG操作,和ZIG-ZIG有所不同——它需要先把x结点右旋,再把y结点左旋。
旋转后结点变化如下图:
其实,基本上自己画个图就能看出来伸展操作了。