AVL树,是一种平衡(balanced)的二叉搜索树。
二叉平衡树是二叉查找树(二叉排序树)的另一种形式,其特点为:树中每个结点的左、右子树深度之差的绝对值不大于1 。
关于AVL树的操作,大部分都能复用平衡二叉树树的操作,但是对于插入和删除操作来说,很可能由于节点的插入和删除导致AVL树的平衡状态就被破坏,所以我们需要一种机制来检测这棵树是否平衡,以及当它不平衡的时候,我们应该通过某些操作使它重新平衡(rebalanced)。
结点的平衡因子—— 结点的左子树深度与右子树深度的差。
AVL树中每个结点的平衡因子只能是 -1, 0, 1
在AVL树的存储表示中,每个结点不仅要存储关键字和左、右孩子指针等,而且要存储结点的平衡因子。
在AVL树的插入或删除过程中,需根据相关平衡因子的变化情况,对树的结构进行调整,以使之保持平衡。
旋转
如果在AVL树中进行插入一个新的节点或删除某个节点后,可能导致AVL树失去平衡。这种失去平衡的可以概括为4种姿态:LL(左左),LR(左右),RR(右右)和RL(右左)。
上图中的4棵树都是"失去平衡的AVL树"。除了上面的情况之外,还有其它的失去平衡的AVL树
AVL树失去平衡时的情况一定是LL、LR、RL、RR这4种之一
LL:称为"左左"。插入或删除一个节点后,根节点的左子树的左子树还有非空子节点,导致"根的左子树的高度"比"根的右子树的高度"大2,导致AVL树失去了平衡。
LR:称为"左右"。插入或删除一个节点后,根节点的左子树的右子树还有非空子节点,导致"根的左子树的高度"比"根的右子树的高度"大2,导致AVL树失去了平衡。
RL:称为"右左"。插入或删除一个节点后,根节点的右子树的左子树还有非空子节点,导致"根的右子树的高度"比"根的左子树的高度"大2,导致AVL树失去了平衡。
RR:称为"右右"。插入或删除一个节点后,根节点的右子树的右子树还有非空子节点,导致"根的右子树的高度"比"根的左子树的高度"大2,导致AVL树失去了平衡。