BST
- 循关键码查询,综合向量和列表的优点
- 顺序性:任意节点不小于右后代,不大于左后代
- 中序查找输出单调非减
查找
减治,从根节点出发,将当前节点与目标数据比较,直到抵达目标节点或空树。 时间复杂度为 过程可视为有序向量的二分查找
插入
先 search 到插入位置 _p,再创建新节点作为 _p 的孩子。
删除
单分支
删去节点后用唯一子树代替。
双分支
找到对应节点的右子树的最小节点或左子树的最大节点(直接后继或直接前驱),将这两个节点交换,再删去对应节点,此时问题转化为单分支删除。
- 交换时破坏了顺序性

平衡
BST 的查找、插入和删除时间最坏情况下均正比于高度 有多可能出现最坏情况?
-
随机生成:假设各个排列出现的概率相等,按该次序插入,计算得平均高度为
-
随机组成:假设各种组成的 BST 形状出现的概率相等,共有 颗,计算得平均高度为
-
实际上,理想随机在实际情况中难以出现,各种局部性、周期性、单调性、关联性等使得朴素实现的 BST 容易退化
-
理想平衡:树高为
-
渐近平衡:树高渐近为
旋转
只需 时间
旋转后全树的高度变化不超过 1
经过不超过 次旋转,等价的 BST 均可相互转化
AVL 树
平衡因子
- 定义为左子树高度-右子树高度
- 要求任意节点的平衡因子绝对值小于等于 1
渐近平衡
个节点组成的 AVL 树,高度 等价地,高度为 的树,规模 证明: 设高度为 的树的规模最少为 有 这样固定高度下最小的 AVL 树称为 Fibonaccian Tree
- AVL 树的高度约为
失衡
- 插入:从祖父开始,每个祖先都有可能失衡,且可能同时失衡
- 删除:从父亲开始,每个祖先都有可能失衡,但瞬时至多一个
插入
单旋
同时可有多个祖先失衡,找到第一个失衡的祖先,做一次旋转,全树复衡。

双旋
同时可有多个祖先失衡,先做一次旋转转换为单旋,再做一次旋转复衡。

删除
瞬时至多一个失衡节点,旋转复衡后子树高度未必复原,失衡可能持续向上传播,最多需做 次调整。 双旋情况可先做一次旋转后转换为单旋情况。
342 重构
AVL 树的重平衡总得来讲就是3 个节点、4 个子树的重构,且外侧的2 个子树相对位置不会改变。
针对重平衡过程中可能的 4 种情况,分别调用重构函数即可。

优缺点
- 优点:最坏情况下时间复杂度都不过 ,空间复杂度为
- 缺点:删除操作最坏情况下需旋转 次,单次动态调整后,全树拓扑结构变化量高达 ,对并发有影响