1、平衡二叉搜索树介绍
1.1、什么是平衡二叉搜索树?
平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称为 AVL 树,其实就是一颗 平衡的二叉排序树 。AVL树或者是一颗空树,或者是具有下列性质的二叉排序树:
它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过 1 。
一棵AVL树有如下必要条件:
- 条件一:它必须是二叉查找树。
- 条件二:每个节点的左子树和右子树的高度差至多为1。
1.2、什么是平衡因子?
平衡二叉树上结点的 平衡因子 BF(Balanced Factor) 定义为该结点的左子树深度减去它的右子树的深度,平衡二叉树上所有结点的平衡因子只可能是 -1,0,1。
最小不平衡子树: 距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树。
2、平衡二叉树的旋转
在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。那么调整不平衡树的基本方法就是: 旋转,分为左旋转、右旋转两种。
2.1、左旋转
逆时针旋转AVL树的两个结点X和Y,使得父结点被自己的右孩子取代,而自己成为自己的左孩子。说起来有些绕,见下图(标号1,2,3的三角形,是结点X和Y的子树):
图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转。
2.2、右旋转
顺时针旋转AVL树的两个结点X和Y,使得父结点被自己的左孩子取代,而自己成为自己的右孩子。见下图:
图中,身为左孩子的Y取代了X的位置,而X变成了自己的右孩子。此为右旋转。
3、平衡二叉树的调整
若出现不平衡,则要根据新插入的结点与最低不平衡结点的位置关系进行相应的调整。分为LL型、RR型、LR型和RL型4种类型。
3.1、左左(LL)
顾名思义,祖父结点A有一个左孩子结点B,而结点B又有一个左孩子结点C。标号1,2,3,4的三角形是各个结点的子树。
在这种局面下,我们以结点A为轴,进行右旋操作:
3.2、右右(RR)
祖父结点A有一个右孩子结点B,而结点B又有一个右孩子结点C。
在这种局面下,我们以结点A为轴,进行左旋操作:
3.3、左右(LR)
祖父结点A有一个左孩子结点B,而结点B又有一个右孩子结点C。
在这种局面下,我们先以结点B为轴,进行左旋操作:
这样就转化成了左左局面。我们继续以结点A为轴,进行右旋操作:
3.4、右左(RL)
祖父结点A有一个右孩子结点B,而结点B又有一个左孩子结点C。
在这种局面下,我们先以结点B为轴,进行右旋操作: