什么是AVL树
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。
在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。
AVL树的应用
AVL树是一种比二叉查找树还特别的树。这种树就可以帮助我们解决二叉查找树刚才的那种所有节点都倾向一边的缺点的。具有如下特性:
- 具有二叉查找树的全部特性(首先本身是一棵二叉查找树)
- 带有平衡条件:每个节点的左子树和右子树的高度差至多等于1。
- 也就是说,AVL树,本质上是带了平衡功能的二叉查找树
AVL树的操作
- 查找
- 插入
- 旋转
- 删除
AVL树大部分操作都和BST树相同, 只有在插入删除结点时, 有可能造成AVL树失去平衡, 而且只有那些在被插入/删除结点到根节点的路径上的结点有可能出现失衡, 因为只有那些结点的子树结构发生了变化。
当插入新结点导致不平衡时, 我们需要找到距离新节点最近的不平衡结点为轴来转动AVL树来达到平衡
AVL树的旋转操作
右旋(左-左型)
把这种倾向于左边的情况称之为左-左型。这个时候,我们就可以对节点9进行右旋操作,使它恢复平衡。
顺时针旋转两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子。
右旋转动态演示
节点4和9高度分别如图所示,高度相差大于1。由于是左孩子的高度较高,此时是左-左型,进行右旋。
左旋(右-右型)
当大部分节点都偏向右边的时候,通过左旋来还原
左旋转动态演示
右-左型(先右旋再左旋)
对于这种 右-左型的情况,处理的方法是先对节点10进行右旋把它变成 右-右型
再进行左旋。
左-右型(先左旋再右旋)
对于左-右型的情况和刚才的 右-左型相反,我们需要对它先进行一次左旋,再进行右旋
AVL树旋转操作总结
-
左-左型:做右旋转。
-
右-右型:做左旋转。
-
左-右型:先做左旋,后做右旋。
-
右-左型:先做右旋,再做左旋。
实例
初始状态如图所示,插入如下数值:1,4,5,6,7,10,9,8
插入1
左-左型,进行右旋调整
插入4
继续插入 5
破坏了平衡条件(每个节点的左子树和右子树的高度差至多等于1)
右-右型,需要左旋转调整。
插入6
右-右型,需要进行左旋
继续插入7
右-右型,需要进行左旋
继续插入10
继续插入9
右-左型:先右旋把它变成右-右型,再进行左旋
参考网址:
https://www.sohu.com/a/270452030_478315