假想这么一种情况,我们想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更短,那些查频率比较高的节点就应该经常处于比较靠近树根的位置,于是最直观的想法就是将每次查找访问的节点都放到树根处,这样再次查找该节点时将会很快的找到该节点。在每次查找访问节点之后对该树进行重构,将被查找的节点搬移到树根,这种自调整型式的二叉查找树就是splay tree(伸展树),它会沿着从某个被访问节点到树根之间的路径,通过一系列的旋转把这个被访问节点搬移到树根。
伸展树通过一系列的旋转把当前被访问节点搬移到树根,以便下次再次访问该节点时速度极快(直接访问根节点就被命中或离树根很近的位置)。为了将当前被访问节点搬移到树根,我们需要沿着查找路径做自底向上的旋转,直至该节点成为树根为止(伸展树定义的旋转是成对进行的,伸展操作不单是把当前被访问节点搬移到树根,而且还把查找路径上的每个节点的深度都大致减掉一半。)。(假设当前被访问节点为X,X的父亲节点为P(如果X的父亲节点存在),X的祖父节点为G(如果X的祖父节点存在))
每一旋转步骤都是下列三种情况之一:
1. 第一种情况:如果P是树根,则旋转连接X和P的边(这种情况是最后一步)。(如果X是左儿子就右旋,如果X是右儿子就左旋)
2. 第二种情况:如果P不是树根,而且X和P本身都是左孩子或者都是右孩子,则先旋转连接P和G的边,然后再旋转连接X和P的边。
3. 第三种情况:如果P不是树根,而且X是左孩子,P是右孩子,或者相反,则先旋转连接X和P的边,再旋转连接X和新的P的边。