介绍
伸展树(Splay Tree)和AVL树一样是一种特殊的二叉查找树。
特点: 当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处是,下次要访问该节点时,能够迅速的访问到该节点。
伸展树保证从空树开始连续M次对树的操作最多花费O($M*\log{N}$)时间,但不排除任意单次操作花费O(N)时间的可能。伸展树基于这样的事实:对于二叉查找树来说,每次操作最坏情形时间O(N)并不坏,只要相对不常发生就行。
伸展splaying
自底向上伸展
伸展树主要有三种旋转操作:单旋转,一字形旋转和之字形旋转。
zig形
zig:当目标节点x是根节点的左子节点或右子节点时,进行一次单旋转,将目标节点调整到根节点的位置。
zig-zag形
zig-zag:当目标节点X、父节点P和祖父节G点成”zig-zag”构型时,进行一次双旋转,将目标节点调整到祖父节点的位置。从祖父节点开始进行两次异向的单旋转操作。
zig-zig形
zig-zig:当目标节点X、父节点P和祖父节点G成”zig-zig”构型时,进行一次zig-zig操作,将目标节点调整到祖父节点的位置。从祖父节点开始进行两次同向的单旋转操作。
注:Bottom-up splay trees are hard to implement. (Sad Story)
自顶向下伸展
在自底向上的伸展树中,我们需要求一个节点的父节点和祖父节点,因此这种伸展树难以实现。因此,我们可以构建自顶向下的伸展树。
当我们沿着树向下搜索某个节点X的时候,我们将搜索路径上的节点及其子树移走。我们构建两棵临时的树──左树和右树。没有被移走的节点构成的树称作中树。
- 左树:包含所有已经知道比目标节点小的节点。
- 右树:包含所有已经知道比目标节点大的节点。
- 中树:没有被移走的节点。
zig形
孩子即为要查找的点,只需要一次连接操作。
zig-zag形
孙子为要查找的点,而且呈之字形,只需要两次连接操作。
zig-zig形
孙子为要查找的点,而且呈一字形,先要进行一次旋转操作,再进行一次连接操作。
合并
将中树的左右子树分别连接到左树的右子树和右树的左子树上。将左右树作为X的左右子树。
TopDown实现
伸展splay
|
|
插入insert
|
|
删除remove
|
|
完整实现
|
|
感谢:http://www.cnblogs.com/skywang12345/p/3604286.html
http://www.cnblogs.com/UnGeek/archive/2013/04/10/3013333.html