AVL(平衡二叉树)

AVL定义

  • 左子树和右子树的高度之差的绝对值不超过1,高度之差也叫做平衡因子(Balance Factor),简称BF
  • 左右子树也都是平衡二叉树

AVL平衡二叉树旋转详解_子树

当一个节点没有左子树时,左子树高度为-1
当一个节点的左子树时叶子节点时,左子树的高度为0
当一个节点的左子树的左子树是叶子节点时,左子树的高度为1
# 如图所示:
# 例1:
以2为根节点,左子树的高度为0,右子树的高度为1,0 - 1 = 1,满足平衡二叉树条件 -1 <= BF <= 1
# 例2:
以1为根节点,左右子树的高度都为-1,-1 - -1 = 0,满足平衡二叉树条件 -1 <= BF <= 1,叶子节点也是平衡二叉树
# 例3:
以3为根节点,左子树高度为-1,右子树高度为0,-1 - 0 = -1,满足平衡二叉树条件 -1 <= BF <= 1

AVL插入

  • 二叉平衡树在插入或删除一个结点时,先检查该操作是否导致了树的不平衡,若是,则在该路径上查找最小的不平衡树,调节其平衡。
  • 4种平衡调整如下:
LL(左左右单旋转)

AVL平衡二叉树旋转详解_平衡二叉树_02

# LL(左左)右单旋转,举例:
1、插入20后,导致50为根节点的树失衡(左子树高度为2,右子树高度为0,已40为根节点的树并没有失衡)
2、20节点在50的左子树上,最终也是在30的左子树上,在左左子树的左边节点,满足左左,进行右单旋转
3、右单旋转可以把树看做是一根链条,以50为支点,向右边拉动一格
4、旋转完成后,恢复平衡
RR左单旋转

AVL平衡二叉树旋转详解_平衡二叉树_03

# RR(右右)左单旋转,举例:
1、插入65后,导致40为根节点的树失衡(左子树高度为0,右子树高度为2,已50为根节点的树并没有失衡)
2、65节点在40的右子树上,最终也是在60的右子树上,在右子树的右边节点,满足右右,进行左单旋转
3、左单旋转可以把树看做是一根链条,以40为支点,向左边拉动一格
4、旋转完成后,恢复平衡
LR左右情况

AVL平衡二叉树旋转详解_子树_04

# 无法通过一次旋转恢复平衡,先将左子树向左旋转一次,转换成LL型,再向右旋转
# 第一列:
1、插入42后,导致50为根节点的树失衡(左子树高度为2,右子树高度为0)
2、42插入在左子树的右子树上,将左子树向左旋转一次
3、此时满足了LL,向右旋转一次
4、恢复平衡
RL右左情况

AVL平衡二叉树旋转详解_子树_05

# 无法通过一次旋转恢复平衡,先将右子树向右旋转一次,转换成RR型,再向左旋转
# 第一列:
1、插入43后,导致40为根节点的树失衡(左子树高度为0,右子树高度为2)
2、43插入在右子树的左子树上,将右子树向右旋转一次
3、此时满足了RR,向左旋转一次
4、恢复平衡