伸展树(Splay Tree),是一种二叉平衡搜索树,时间复杂度均摊为O(logN),即splay树做m次操作的复杂度为O(mlogN)。
在伸展树上的一般操作都基于伸展操作/提根操作:
假设想要对一个二叉搜索树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法, 在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。伸展树应运而生。伸展树是一种自调整形式的二叉搜索树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。
伸展树与AVL树,Treap树不同的是,Splay树不需维护其他性质,他是通过对每次查询,插入处理到的节点进行提根操作来达到这一效果的。它的优势在于不需要记录用于平衡树的冗余信息。
可以证明:伸展树时间复杂度均摊为O(logN)。
伸展/提根的具体形式:两种单旋,四种双旋
单旋:zig(左旋),zag(右旋)
双旋:zig-zig,zag-zag,zag-zig,zig-zag
zig操作(zig(x)):当x的父亲p是原树的根,并且x是p的左儿子的时候进行,效果如图(zag操作类似)。
zig-zig