You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

27 lines
2.2 KiB

伸展树(splay tree)是一颗二叉搜索树它的定义是建立在二叉搜索树之上并且它是基于类似程序局部性原理的假设一个节点在一次被访问后这个节点很可能不久再次被访问。那么伸展树的做法就是在每次一个节点被访问后我们就把它推到树根的位置。正像程序局部性原理的实际效率被广泛证明一样伸展树在实际的搜索效率上也是非常高效的。尽管存在最坏情况下单次操作会花费O(N)的时间但是这种情况并不是经常发生而实际证明伸展树能够保证M次连续操作最多花费O(MlogN)的时间。
相比于平衡二叉树,伸展树有差不多的**平均性能**,其他的优势在于:不需要存储平衡信息。另外如果采用自顶向下的调整方式,还能简略额外的栈开销。
## 伸展树的旋转
#### 一、单R
![[20151102155743401.png]]
什么叫单R型呢在上图中我们查找的元素是9,其父节点是7并且7是根结点查找结点是其父节点的右孩子而且把9变成根结点只需一次左旋转即可即将9提升一层这样的情况我们叫单R型经过一次左旋转后结点9替代了原来的根结点7变成新的根结点注意这里因为图简单9最终变成了根结点在树复杂的情况一般不会一次就变成了根结点但肯定会变成原子树的根这也就是程序中说的当前子树中的新根
#### 二、单L
![[20151102155639325.png]]
单L型和单R型是对称的也就是说查找结点3是其父节点的左子树并且其父节点是根结点这样一次右旋转后3就是根结点了。
#### 三、双R
![[20170904224242553.png]]
所谓RR型简单点说就是两次R型两次左旋转这种情况是查找结点有父节点同时也有祖父结点并且三则在同右侧这种就是RR型针对这种情况先把查找结点的父节点旋转一次即提升一层然后再以查找结点再次旋转这样查找结点就到了根结点了都是左旋转只是旋转对象不一样罢了。
#### 四、双L
![[20151102160109880.png]]
#### 五、RL
![[20151102160900703.png]]
#### 六、LR
![[20151102160736300.png]]