伸展树
简要提点
- 伸展树(Splay Tree)是一种二叉排序树,能在O(log n)内完成插入、查找和删除操作。
- 伸展树的基本操作都和伸展有关:当带有关键字X的节点被插入时,需要对树进行一系列的伸展旋转使得关键字X的节点成为新的根节点。当查找一个关键字X时,也同样对树进行伸展旋转使得带有关键字X的节点成为根节点。这样下次再查找X时,只需O(1)的时间。
- 伸展树的数据结构使得访问频繁的关键字排在靠近根的位置,减少了频繁关键字的查找时间。
伸展树的旋转
- 三种旋转情况:单旋转、一字形旋转和之字形旋转,每种旋转都分左右两个方向。
- 为了简化旋转操作,假设当前伸展树根节点X,左边有个空节点L节点(旋转过程作为子树的根,自顶向下迭代过程中子树中存放小于X的节点),同样右边有个空节点R节点(旋转过程作为子树的根,自顶向下迭代过程中子树中存放大于X的节点)当然也可以不借助L和R直接在树中自顶向下依次旋转调整。
单旋转
- 如下图假设(要查找的)目标节点为YY节点,则需要进行一次单旋转(左),将
调整为中间树的新根。
一字形旋转
- 类似于AVL树的单旋转如下图假设(要查找的)目标节点为ZZ节点,则需要进行一次一字形旋转(左),将
调整为中间树的新根。
SplayTree SingleRotateWithLeft(SplayTree Sp) // 一字形旋转(左)类似AVL单左旋
{
SplayNode