AVL树简介
AVL树是被最先发明的一种较为简单的平衡二叉查找树。
它的特点是:
1.本身首先是一棵二叉查找树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子LoadFactor)最多为1。
(根结点的高度最高,最底层的叶结点的高度最低且为1。由叶结点向上到树的根结点,树的高度不断增加。例如,只有一个结点的树,该结点即是根结点,高度为1;有两个结点的树,叶结点的高度为1,根结点的高度为2。一棵树总的高度与深度相同,但是树中同一个结点的高度与深度互补。)
优点:
无论是查找、插入或删除,它在最坏情况下的时间复杂度均为O(logN),空间复杂度为O(N)
缺点:引入了平衡因子的概念之后,需要封装更多的信息。其实测复杂度与理论值尚有差距。
上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都小于等于1;而右边的不是AVL树,因为结点7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1)。
AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。
在对AVL树进行插入或删除一个结点之后,会可能导致树中某个结点的左右子树的高度之差超过1,从而破坏了AVL树的适度平衡。因此,为了让它重新回到平衡状态,需要采取额外的操作。
重平衡操作
在AVL树中进行插入或者删除一个结点之后,可能会导致AVL树的失衡。AVL树失衡的状态一共可以分为以下四种:
1、LL情况
如下图所示,进行一次右旋转RotateRight就可以恢复树的平衡。