平衡二叉搜索树:AVL树与伸展树详解
1. AVL树删除操作
从AVL树中删除一个值的方法与常规二叉搜索树删除操作类似。不过,在删除最终的叶子节点后返回的过程中,需要调整节点的平衡因子。
- 迭代实现 :可以维护一个路径栈,记录从根节点到被删除节点的路径。
- 递归实现 :在递归调用返回时调整平衡因子或高度。
当路径上某个节点的平衡因子调整后达到2时,需要进行左旋操作来重新平衡树;若平衡因子为 -2,则需要进行右旋操作。这些旋转操作可能会级联到树的根节点。
2. 伸展树概述
AVL树通过计算和维护每个节点的平衡因子(-1、1或0)来保证树的平衡,从而确保查找、插入和删除操作的时间复杂度为 $O(log n)$。然而,AVL树的每个节点都需要额外维护平衡信息,这增加了内存开销和操作时间。
伸展树的出现是为了改进这一问题,它引入了空间局部性的概念。在处理大数据集时,数据访问往往具有局部性,即短时间内可能多次访问相同或几个数据块,之后一段时间内可能不再访问,而访问其他相对较小的数据子集。如果能将近期访问的数据存储在树的顶部,可能会提高查找和插入新值的整体时间。
在伸展树中,每次插入或查找操作都会将插入或查找的值通过伸展操作移动到树的根节点。删除值时,可能会将其父节点伸展到根节点。伸展树仍然是二叉搜索树,但它不包含任何平衡或高度信息。
伸展树具有以下特点:
- 无需平衡信息 :伸展过程不需要子树的平衡或高度信息,仅依靠二叉搜索树的结构即可。
-