一,基本概念
AVL树是一种结构平衡的BST树,被称为平衡二叉树。
AVL树的具体特点是,每一个节点的左子树和右子树的高度差的绝对值最多为1,且其左子树和右子树也是AVL树。
BST树有时候会退化为一个链表,但是AVL树不会,因为AVL树具有自平衡属性。
AVL的自平衡是基于平衡因子来维持,平衡因子就是BST树中每个节点的左子树和右子树的高度差。因此对于AVL树来说,平衡因子的值应始终为 -1、0 或 +1。
如果平衡因子为1,则左子树比右子树深一级。
如果平衡因子为0,则左右子树处于相同的深度。
如果平衡因子为-1,则左子树比右子树浅一级。
最小不平衡子树:距离插入节点最近,且以平衡因子绝对值大于1的节点为根结点的子树。
二,AVL树的基本操作
插入节点和删除节点的操作,请参考前面写过的BST树的基本操作。
此处主要讲AVL树的再平衡问题,因AVL树是否平衡是基于平衡因子来衡量的,而插入节点和删除节点的操作容易打破AVL树原有的平衡,使平衡因子的绝对值大于1。此时的AVL树变成了不平衡的BST树,为了让BST树再次平衡成为AVL树,需要进行一系列的操作来改变树的结构,这个操作被称为旋转。
当整个AVL树失去平衡时,仅需要对最小不平衡子树进行旋转即可。
旋转操作的本质是子节点和根节点位置的互换。
1.左旋
1.发现一个子树的平衡因子为-2,定为最小不平衡子树。
2.找到破坏平衡的节点,即最小不平衡子树的根节点。
3.左旋最小不平衡子树,使破坏平衡的节点成为子树的左子节点。
2.右旋
1.发现一个子树的平衡因子为2,定为最小不平衡子树
2.找到破坏平衡的节点,即最小不平衡子树的根节点。
3.右旋最小不平衡子树,使破坏平衡的节点成为子树的右子节点。