前言
前面的学习中,笔者就二叉树、二叉查找树、平衡二叉树进行了一些总结。此篇文章主要
讨论伸展树。我们知道的是在二叉查找树上的基本操作(查找、插入)的时间复杂读与树的高度
成正比的关系。对于一个含有N个结点的二叉查找树来说,这些操作的最坏运行情况为OlogN)。
但是我们这知道在极端的情况下,会导致树退化为一个单支树,这导致了操作时间为O(N)。
为了克服上面的情况,出现了一些二叉查找树的变形,例如上篇文章的AVL树。以及接下来
要讨论的伸展树。
伸展树定义
伸展树是基于二叉查找树的,它不保证树一直是平衡的,但是各种操作的平均复杂读是
O(logN) 。
伸展树的设计是具体考虑到了局部性原理(刚被访问的内容下次可能还被访问,查找次数
多的内容可能下次还被访问),为了使整个的查询时间更小,查询频率高的那些结点应当处于
靠近树根的位置。
这样,一个比较好的解决方案就是:每次查找就结点之后对树进行重新构造。把查找的结
点搬移到树根的位置,以这种方式自调×××式的二叉查找树就是伸展树。
旋转操作
搞清楚了伸展树的定义,那么我们来看看是如何实现结点的搬移操作的,和AVL树一样同样
是通过旋转来操作的。具体如何旋转,我们分三种情况。单旋转、一字旋转和之字旋转。
这里我们假定访问的结点为A
单旋转
对于单旋转操作,我们先看一个实例,之后对其略做分析。