伸展树
伸展树(
信息处理的典型模式是,将所有数据项视作一个集合,并将其组织为某种适宜的数据结构,进而借助操作接口高效访问。现实中,通常在任意数据结构的生命期内,不仅执行不同操作的概率往往极不均衡,而且各操作之间具有极强的相关性,并在整体上多呈现出极强的规律性。其中最为典型的,就是所谓的“数据局部性”,这包括两个方面的含义:
1)刚刚被访问过的元素,极有可能在不久之后再次被访问到;
2)将被访问的下一元素,极有可能就处于不久之前被访问过的某个元素的附近;
充分利用好此类特性,即可进一步地提高数据结构和算法的效率。就二叉搜索树而言,数据局部性具体表现为:
1)刚刚被访问过的节点,极有可能在不久之后再次被访问到;
2)将被访问的下一节点,极有可能就处于不久之前被访问过的某个节点的附近;
因此,只需将刚被访问的节点,及时地“转移”至树根(附近),即可加速后续的操作。当然,转移前后的搜索树必须相互等价。
一种直接方式是:每访问过一个节点之后,随即反复地以它的父节点为轴,经适当的旋转将其提升一层,直至最终成为树根。
随着节点
为克服上述伸展调整策略的缺陷,一种简便且有效的方法就是:将逐层伸展改为双层伸展。具体地,每次都从当前节点
第一种情况是 LL 右双旋或 RR 左双旋,先祖父后父节点,两者对称:
第二种情况是 RL 右左双旋或 RR 左右双旋,先父节点后祖父,两者对称:
前两者为将节点上推两层,接下来第三种情况则是往上一层,此时树高为 2,调整后成为根:
Tarjan 等人采用势能分析法已证明,在改用“双层伸展”策略之后,伸展树的单次操作均可在分摊的
在伸展树中查找任一关键码
为将关键码
为从伸展树
得益于二叉搜索树的顺序性,此时节点
树
其中,所有外部节点均深度相等。同时,每个内部节点都存有不超过
若被删除关键字在非终端节点,则用直接前驱或直接后继来替代被删除的关键字。直接前驱: 当前关键字左侧指针所指子树中“最右下”的元素;直接后继:当前关键字右侧指针所指子树中“最左下”的元素,然后再按前面所述方法进行处理。