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.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
伸展树(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]]