伸展树
伸展树是自平衡的二叉查找树,伸展树不像AVL树,要时刻保持平衡。伸展树通过分摊保持查找的高效率。
伸展树的基本思想:当一个节点被访问后,它就要进过一系列AVL树旋转被放在根上。
数据局部性
可视化伸展树
http://www.link.cs.cmu.edu/splay/
这个网站是伸展树的创始人做到一个project。将伸展树可视化。学伸展树的时候可以看看。
实现
由于数据结构与算法分析:C语言描述上面只是介绍了伸展树,但是没有代码实现。所以这篇blog主要写我是怎么实现伸展树的。
zig/zag
伸展树里最重要的一点就是zig/zag了
zig
zig其实就是AVL的左旋
zag
zag其实就是AVL的右旋
zig/zag组合
有了zig,zag。就可以实现伸展树了。
伸展树通过zig,zag的组合来旋转。伸展式是通过两层旋转。为什么可以可见书上证明。
zig,zig组合
如果V是父节点的左儿子,V的父节点是V祖父节点的左儿子。如图:
这个时候要用zig,zig旋转,如图
zag,zag组合
如果V是父节点的右儿子,V的父节点是V祖父节点的右儿子。如图:
这个时候要用zag,zag旋转,如图
zig,zag组合
如果V是父节点的左儿子,V的父节点是V祖父节点的右儿子。如图:
这个时候要用zig,zag旋转,如图
zag,zig组合
如果V是父节点的右儿子,V的父节点是V祖父节点的左儿子。如图:
这个时候要用zig,zag旋转,如图
code:
上面的图终于搞完了。上代码:我没有使用书最后一章自顶而下的实现方法