介绍

伸展树是一种特殊的二叉查找树,其基本思想是当一个节点被访问后,需要经过一系列的AVL树的旋转操作将该节点推到根节点。伸展树不要求像AVL树那样保留树的高度或者平衡信息,但是可以保证开始连续M次对树的操作最多花费O(logN)时间。

展开

展开(splaying)操作是将访问的节点通过一系列旋转变为根节点的过程。假设节点X是访问路径上非根节点,X存在父节点P和祖父节点G。伸展树的展开操作可以分为自下而上和自上而下的展开过程。
1. 自下而上的伸展过程
如果X的父节点P是根节点,则只需要旋转X和树根;反之如果,需要考虑两种情况。
第一种情况是之字形,如下图,X位于G的左节点的右子树,需要执行AVL双旋操作,同理X位于G的右节点的左子树。
数据结构与算法-伸展树
第二种情况是一字形,如下图2,X位于G的左节点的左子树或者其对称的情况,则需要进行如下的操作:先对G执行右旋转,此时P作为根节点,然后再对P执行右旋操作,此时X成为根节点。
数据结构与算法-伸展树
通过自下而上的方式需要保存查询路径上各个节点的指针。
2. 自上而下的伸展过程(参考自博客
当自上而下搜索某个节点X的时候,将搜索路径上的节点及其子树移走,并构建两棵临时的树–左树和右树。当前节点T作为中树的根;值小于T的节点构成左树;值大于T的节点构成右树。其中,右树的左节点始终为null,左树的右节点始终为null,接下来将以图例的方式讲解伸展过程。
当查询位置在节点G时,左树为null,右树为null,中树为G为根节点的整棵树,如下图所示。
数据结构与算法-伸展树
然后向下走,当查询位置为节点P时,左树仍为null,右树为根节点为G的部分子树
数据结构与算法-伸展树
继续向下走,当查询位置为节点X时,左树仍为null,右树包括根节点为P的部分子树和根节点为G的部分子树,需要将二者合并成根节点为P的子树。
数据结构与算法-伸展树
最后将现存的左、中、右三颗树合并,并将上图中中树的左子树插入到左树的最右节点,中树的右子树插入到右树的最左节点,完成合并,构成如下的以节点X作为根节点的树。
数据结构与算法-伸展树

相关文章: