特征
AVL树是 平衡 && 搜索 && 二叉树
1. 搜索树
中序遍历一定是有序的,并且按照key的大小顺序排列
任取节点,left.key < root.key < right.key
2. AVL树中平衡的定义
任取节点,要求 节点左子树的高度 和 节点右子树的高度 的高度差的绝对值不能超过 1
平衡因子(Balance Factor / BF):
bf就是节点的左右子树高度差,node.BF = H(node.left) - H(node.right) 左-右/右-左 都可以
AVL树中的所有节点的 node.BF = -1, 0, 1 这三种情况其一
树的旋转:
AVL的操作
1. 查找(完全等同于一般搜索树的查找)
2. 插入
AVL树的插入规则:
1. 按照一般搜索树的插入规则进行节点的插入
随着新节点的插入,导致BF可能发生变化,所以需要调节平衡因子
插入后对节点平衡因子的影响:
① BF(node) == 0 左右子树都为空
②BF(parent.parent) 不变 【只考虑直接影响,parent.parent暂时不变】
③BF(parent) 平衡因子左加右减
if(node 是 parent.left) H(parent.left)++ BF(parent)++
else(node 是 parent.right) H(parent.right)++ BF(parent)--
插入后有三种情况:
情况一:插入后BF变成 0 情况二:插入后BF变为 1/-1 情况三:插入后BF变为 2/-2
①插入后BF变成 0
②插入后BF变为 1/-1
③插入后BF变为 2/-2
AVL树的失衡情况有四种:LL,LR,RL,RR
处理方式:
LL:对parent做右旋,插入结束
LR:先对node做左旋变成LL,再对parent做右旋,插入结束
RR:对parent做左旋,插入结束
RL:先对node做右旋变成RR,再对parent做左旋,插入结束
旋转正确性证明: