普通二叉查找树的局限
二叉查找树(Binary Search Tree)有着许多应用,但是二叉查找树的基本操作时间与树的高度成正比,如果一棵树为n个结点的线性链表,则查找的时间复杂度会达到O(N).
由此产生了AVL树等改进版的二叉查找树,以维护查找的时间复杂度一直保持O(log N).
二叉伸展树
二叉伸展树也是一种改进的二叉搜索树,但与AVL不同,它不用每一步都保持二叉树的平衡,而是每次查找到节点之后,对树进行重构(把被查找到的节点换到根节点的位置),这种二叉树的查找时间复杂度也可以一直保持O(log N).
个人认为,伸展树比AVL好理解、代码上也好实现一点.
伸展树依据局部性原理:刚被查找的内容很有可能再次被访问(说实话,俺是没搞懂这个原理啥意思)
伸展树维护过程
我将其分为六种情况:
-
左型(右旋一次)
-
右型(左旋一次)
-
左左型(右旋两次)
-
右右型(左旋两次)
-
右左型(先右旋,再左旋)
-
左右型(先左旋,再右旋)