一、什么是AVL树
AVL树是自平衡的二叉搜索树(二叉查找树、二叉排序树),AVL树再二叉搜索树的基础上通过旋转来得到平衡,平衡即任意一个结点的两个子树的高度差最高为1。
二、旋转
首先我们来看一下如何通过旋转来使得树平衡。
1、左单旋转
解决如下情况:
- 定义新的根结点指向当前根的右孩子
- 新根的左孩子等于旧根,旧根的右孩子等于新根的左孩子
- 将新根插入到旧根原来位置
注意:维护其中各个结点的父节点
2、右单旋转
- 定义新的根节点指向当前根的左孩子
- 新根的右孩子指向旧根,旧根的左孩子指向新根的右孩子
- 将新根插入旧根原来的位置
注意:维护其中各个结点的父节点
3、左双旋转
- 先进行一次左单旋转
- 再进行一次右单旋转
4、右双旋转
- 先进行一次右单旋转
- 再进行一次左单旋转
三、插入元素
1、找到被插入元素的位置
2、插入元素
3、调整平衡
前两步并没有什么难度,在二叉搜索树中找到合适的位置即可。第三步调整平衡又有以下过程:
(1)从插入元素的位置向上找,找到不平衡的位置
(2)左子树出现不平衡,进行左调整,否则右调整,左右调整则依赖于旋转(平衡与否通过平衡因子的变化来判断)
四、删除元素
删除元素分为以下步骤:
1、找到需要被删除的元素位置
2、此时判断该元素有几个子树:
- 没有子树,该元素是叶子节点,那么直接删除该结点即可
- 只有左子树或者右子树,调整该结点的父节点中孩子的指向
- 左右子树都有,此时应该找到该结点的后继,因为该节点右右孩子,则其后继一定是其右子树中的最左边的结点,且其后继节点最多只有一个右子树,找到之后,将后继节点的值赋给当前要删除的结点,此时删除其后继结点即可。
3、从删除结点的位置向上判断是否平衡,并进行调整。