AVL树理解、证明(学习笔记)

AVL树理解、证明

注解:学习AVL树之前需要有二叉排序(搜索)树的基础,本文假定读者已经有这个基础。AVL树和二叉搜索树的插入删除不同,但查找相同,故AvlTree可以继承BST实现。

1.LL

LL

(1)插入前,k1,k2,X,Y,Z都平衡;插入后只有k2不平衡

  1. X-1-Y=0
  2. X-1+1-Z=1
    证明:|Y-Z|<1 and |X-max(Y,Z)-1|<1

X=Z+1 and X=Y+1 成立
可得: Y=Z => |Y-Z|<1 成立
可得:max(Y,Z)=Y =>|X-max(Y,Z)|=X-Y=0<1 成立

最简单的情况举例:
在这里插入图片描述注解:插入平衡前树高度h1=X-1+2=+1,插入平衡后树高度=X+1,所以前后高度不变,不影响父节点(多级)平衡性。

2.LR

在这里插入图片描述
插入前k1,k2,k3都平衡,插入后只有k3不平衡
假设由于B的增加导致k3失去平衡

  1. B=C+1
  2. B+1-A=1
  3. B+2-D=2
    可得:B=D and A=B and D=C+1 所以k1,k3都平衡
    可得 max(A,B)-max(C,D)=B-D=0 所以k2平衡

最简单的情况举例(这是上面的特例):
在这里插入图片描述注解:插入平衡前树高度h1=C+3 插入平衡后树高度=C+1+2=C+3,所以前后高度不变,不影响父节点(多级)平衡性。

注:

(1)LR中,如果由于C的增加导致k3失去平衡,那么同理

(2)至于RR和RL情况为这两种情况的镜像对称,所以不再说明

(3)由于插入是自顶向下判断而平衡是自底向上的,所以LR中只需要考虑k3失去平衡就可以了,因为底下已经判断过了

(4)总的来说,平衡策略是把高度小的组件下调,把高度高的组件上调,满足平衡因子绝对值不大于2,并且满足二叉搜索树的条件。

3.深度复杂度

设AVL树深度为h,则最少节点数f(h)的表达式如下图所示:
在这里插入图片描述
表达式类似于斐波那契数列,则f(h)逆函数为g(N),则应该能推出O(g(N))=O(log(N)) (本人不会证明…)

转载请注明出处,图片来自于《数据结构与算法分析Java语言描述》

猜你喜欢

转载自blog.csdn.net/weixin_42111859/article/details/104022444