AVL树简介

AVL树简介

简介

在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。
(摘自wikipedia)

AVL树的特点

  1. AVL树本质上是一棵二叉搜索树,且任一子树也都是AVL树(包括空树)
  2. 以左右子树的高度差为平衡因子(一般为左子树高度HL-右子树高度HR),当平衡因子处于[-1,1]范围内时视为平衡
  3. 当AVL树失衡时,通过旋转操作使得整棵树恢复平衡

AVL树的插入与旋转操作

插入

插入操作与二叉搜索树的插入操作基本一样递归处理插入即可,需要注意的是插入后要及时向上更新路径上的所有节点的平衡因子,当发现不平衡时,进行旋转操作使得整棵树恢复平衡(每次插入只要处理最靠近插入点的不平衡节点,即可使整棵树恢复平衡),然后继续更新平衡因子即可

旋转

在讲解旋转操作之前首先要指出一点:旋转不改变二叉查找数的基本结构
这也就是说,在操作前后任意节点都满足左子树的所有节点值都小于该节点,右子树的所有节点值都大于该节点

旋转操作有左旋和右旋两种:
《AVL树简介》《AVL树简介》
可见旋转前后ABC的相对位置关系没有发生变化(实际上旋转前后Bl和Br等子树的位置变化也是满足的二叉搜索树的节点的相对位置关系的)
左旋时的C节点和右旋时的A节点可代表任意AVL树(包括单个节点和空树)

在向已平衡的树中插入一个节点后,这棵树树可能仍然平衡(无需处理),也可能失去平衡(需要恢复平衡).若失去平衡,则平衡因子为2或-2.两种情况下操作类似,只需反向旋转即可.

以平衡因子为2时为例:

由于左子树比右子树高,所以应进行右旋操作

  1. 若是新插入的节点处于B节点的左子树中(或者说B节点的平衡因子为1,这种情况也称为LL),则只需要进行一次右旋,即可使整棵树恢复平衡
    《AVL树简介》
  2. 若是新插入的节点处于B节点的右子树中(或者说B节点的平衡因子为-1,这种情况也称为LR).在这种情况下直接右旋会导致循环往复,为避免操作的死循环,应先作一次左旋处理
    《AVL树简介》

AVL树的删除操作

删除操作主要有两种方法

  • 用在二叉搜索树中删除节点的方法删除节点(用前驱或后继节点替换要删除的节点),然后再对不平衡的节点进行旋转操作
  • 多次向下旋转使得要删除的节点变为一个叶子节点(实际上只要有一个孩子为空时就可以删了),然后直接删除

(本文为本菜游戏之作,若有谬误请指出,我将尽快改正.转载请注明出处)

    原文作者:AVL树
    原文地址: https://blog.csdn.net/lincifer/article/details/42525415
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞