假设本来这棵树是平衡的,在我们在插入一个结点以后,导致了这棵树的不平衡,那么必然是这棵树根结点的平衡因子从 +1 变成了 +2,或者从 -1 变成了 -2 。我们来分别讨论这两种情况。 实际上,总共有四种情况: 1)LL,根结点的平衡因子 +2,左子树根结点平衡因子 +1; 2)RR,根结点的平衡因子 -2,右子树根结...
先画个图,进行说明,不是平衡二叉树,只是为了说明问题,如下图: 说明:如上图,树的高度从叶子节点开始,并且叶子节点高度是1;平衡因子就是用左子树高度减去右子树高度,例如:4这个节点,左子树2的高度为1,右子树没有则为0,所以4这个节点的平衡因子为1。 三、AVL树 1、定义 AVL树是自平衡二分搜索树,既具有平衡...
右平衡:不同情况下,平衡因子变化有些不一样,但是只要属于这种类型则调整平衡方法可统一,即为:先左旋,再右旋。 //对因在右子树上新插入结点导致失衡的最小失衡子树T进行右平衡处理 void RightBalance(BSTree &T)//对以指针T所指结点为根的二叉树作右平衡旋转处理 { BSTree rc,ld; rc=T->rchild; //树是...
说明:如上图,树的高度从叶子节点开始,并且叶子节点高度是1;平衡因子就是用左子树高度减去右子树高度,例如:4这个节点,左子树2的高度为1,右子树没有则为0,所以4这个节点的平衡因子为1。 三、AVL树 1、定义 AVL树是自平衡二分搜索树,既具有平衡性和二分性。 2、构建AVL树类 是在二分搜索树的基础上进行修改...
当最小不平衡节点右子树高则需要左旋,左子树高则需要右旋(还有些情况需要先对其左/右子树旋转)。 思考: 1、既然旋转是通过平衡因子|bf|>1来决定怎么旋转的,那么在旋转前这些平衡因子是什么时候赋值的呢? 2、旋转之后,哪些节点需要调整?,平衡因子又改如何调整呢?
在调整过程中,要保证平衡二叉树依然是搜索树。 RR旋转 如上图,若“麻烦结点”插入在B_R后(可左、可右),则以“发现者”作为根节点进行旋转。 RR旋转的例子如上。 LL旋转 如上图为LL旋转。 LR旋转 如上图,当“破坏者”被插在“被破坏者”的左子树的右子树上,进行LR旋转。为保证二叉搜索树特性,根结点附近...
在平衡二叉树中,每个节点的平衡因子为-1、0或1。 平衡二叉树(AVL树)是一种高效的数据结构,它的时间复杂度为O(logn),可以在非常快的时间内完成数据的查找、插入和删除操作。但是,如果平衡二叉树的平衡因子不合适,就会导致树的高度增加,使得查找、插入和删除操作的效率变低。因此,平衡二叉树的平衡因子非常重要。
旋转的目的就是减少高度,通过降低整棵树的高度来平衡。哪边的树高,就把那边的树向上旋转。 5.1 左旋 图5.1.1 以图5.1.1 为例,加入新节点 99 后, 节点 66 的左子树高度为 1,右子树高度为 3,此时平衡因子为 -2。为保证树的平衡,此时需要对节点 66 做出旋转,因为右子树高度高于左子树,对节点进行左旋操作...
平衡二叉树的主要特点是任意节点的左子树和右子树的高度差(平衡因子)不超过1。换句话说,对于树中的每个节点,它的左子树和右子树的高度差的绝对值最多为1。 平衡二叉树的平衡性质可以通过旋转操作来维护。旋转操作包括左旋(Left Rotation)、右旋(Right Rotation)、左右旋(Left-Right Rotation)和右左旋(Right-Left ...