1 定义
二叉搜索树中各节点的平衡因子不大于1,则该树为AVL树
1.1 平衡因子
任一节点v的平衡因子定义为其左、右子树的高度差
,即平衡因子=左子树高度 - 右子树高度
1.2 平衡性
可以证明在渐进意义而言,AVL树的高度为O(logn),因此AVL树符合适当平衡。
2 失衡与重平衡
2.1 失衡
AVL树中的查找、插入和删除所采取的策略与普通二叉搜索树一致,但经过动态操作后节点高度可能发生变化,以致于AVL树不再满足条件而失衡。
2.2 插入重平衡
插入失衡可分为两类:子孙同侧、子孙异侧。这两种插入重平衡的策略都可以归结为中间值为父
,即将数值处于三者中间值的为父节点,其余两个节点作子节点。经过重平衡操作后,该局部根的高度不变,因此不会影响至祖先及其他节点的平衡性。
2.3 删除重平衡
删除失衡的拓扑结构也可分为两类:子孙同侧、子孙异侧。删除重平衡策略与插入相同,亦为中间值为父
。由下图可知,在删除重平衡后,可能会使局部根高度的变化,导致祖先失衡,该失衡可能会一直延伸到根节点,此时需要不断向上重复执行重平衡操作,直至全树平衡。
3 效率
3.1 查找效率
AVL的查找算法与二叉搜索树的常规算法一致,消耗时间不超过O(logn)
3.2 插入效率
AVL的插入算法首先是按照二叉搜索树的常规算法,在O(logn)时间内插入新节点,至多再旋转两次完成重平衡,所以插入操作依然可以在O(logn)时间内完成
3.3 删除效率
AVL的删除操作较插入操作,可能需要多次重平衡,但需要重平衡的节点都是删除节点的祖先,故重平衡次数不超过O(logn),重平衡操作需要O(1)时间,所以删除操作总体的时间复杂度依然是O(logn)
该文插图均来自邓俊辉老师的《数据结构与算法》