AVL树,又称为高度平衡的二叉搜索树,它能保持二叉树的高度平衡,尽量降低二叉树的高度,以减少树的平均搜索长度!
AVL树有如下几条性质:
1.左子树和右子树的高度差的绝对值不超过1
2.树中的每个左子树和右子树都是AVL树
3.每个结点都有一个平衡因子(bf),任一结点的平衡因子是-1、0、1
4.每个结点的平衡因子等于右子树的高度减去左子树的高度
AVL树在进行插入操作的时候,是会造成有些结点的平衡因子会发生改变,如下图所示:
其中,红色的圆圈表示要插入的结点。
我们可以看出,插入一个结点后会引起该结点到根结点这条路径上结点的平衡因子发生改变,要想让树继续保持着AVL树的性质,则必须通过旋转才行!
那么,旋转可以分为如下几种情况:
1.左单旋
旋转方法:
1)将结点20的左孩子b赋值给结点10的右孩子;
2)将结点10作为结点20的左孩子;
3)其他结点的位置不变
这样,就可以重新得到AVL树了!
2.右单旋
如上图所示,若将结点35插到结点30的右孩子,则需要进行右单旋。
旋转方法:
1)将结点20的右孩子b赋值给结点10的左孩子;
2)将结点10作为结点20的右孩子;
3)其他结点的位置不变
这样,就可以重新得到AVL树了!
3.左右双旋
如上图所示,若将结点36插到结点30的右孩子,则需要进行左右双旋。
旋转方法:
1)先以结点20作为轴结点,进行左单旋
将结点30的左孩子b赋值给结点20的右孩子;
将结点20作为结点30的左孩子;
其他结点的位置不变
2)再以结点10作为轴结点,进行右单旋
将结点30的右孩子35赋值给结点10的左孩子;
将结点10作为结点30的左孩子;
其他结点的位置不变
这样,就可以重新得到AVL树了!
4.右左双旋
如上图所示,若将结点25插到结点30的左孩子,则需要进行左单旋。
旋转方法:
1)先以结点20作为轴结点,进行右单旋
将结点30的右孩子c赋值给结点20的左孩子;
将结点20作为结点30的右孩子;
其他结点的位置不变
2)再以结点10作为轴结点,进行左单旋
将结点30的左孩子25赋值给结点10的右孩子;
将结点10作为结点30的左孩子;
其他结点的位置不变
这样,就可以重新得到AVL树了!