AVL树是一种高度平衡的二叉搜索树,其每一个结点的左树高和右树高相差不大于1。这个性质使得AVL树的搜索效率要比普通的二叉搜索树要高,因为对于一组递增的数组,其构成的二叉搜索树会是一个链表,搜索时间复杂度自然就是O(n),而其构成的AVL树则肯定是一个搜索效率为O(lg(n))的二叉树。也正因为此,为了保持其平衡的性质,AVL树的插入和删除要比普通二叉搜索树要复杂。
二叉搜索树可以参考二叉搜索树的插入与删除
1. 通过旋转保持AVL树的平衡
旋转分为左旋和右旋两种,这两种操作是对称的,如下图所示。
在插入或者删除结点后,AVL树保持平衡的方法是旋转。对于下图中一颗左子树要比右子树高大1的树来说,如果在其左子树中插入一个结点,则会引起该树不平衡。此时,可通过一次或两次旋转使树平衡。
当结点被插入到b结点的左子树下,只需要对树a进行一次右旋即可,如下图所示,旋转后的树a左子树和右子树高会达到平衡。
当结点被插入到b结点的右子树下,则需要先对树b进行一次左旋转变成上一种情况,再对树a进行一次右旋,如下图所示。
对树b进行左旋后,树b的左子树比右子树高1,即转变为上一种情况(将结点插入到树b的左子树中),然后再对树a进行一次右旋即可将树调整回平衡状态。为什么要对树b进行一次左旋呢?假设我们部队树b左旋,直接对树a右旋,得到的树会是如下图所示。