为什么需要平衡二叉树?不平衡的二叉排序树的查找效率是非常低的,不平衡的最坏情况就是斜树,查找的时间复杂度是O(n),等同于顺序查找。因此我们在构建时就让这棵二叉排序树是平衡二叉树,此时的查找时间复杂度是O(logn),插入和删除也为O(logn),这显然是一种比较理想的动态查找表算法。
平衡二叉树:是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。它是一种高度平衡的二叉树。
平衡因子:将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor)。
最小不平衡子树:距离插入结点最近,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。
平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
1、当最小不平衡子树根结点的平衡因子BF是大于1时,就右旋;小于-1时就左旋。
2、插入结点后,最小不平衡子树的BF与它的子树的BF符合相反时,就需要对结点先进行一次旋转使得符号相同后,再反向旋转一次才能够完成平衡操作。
#define EH 0
#define LH +1
#define RH -1
typedef struct BiTNode
{
int data;
int bf;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
void R_Rotate(BiTree *P)
{
BiTree L;
L = (*P)->lchild;
(*P)->lchild = L->rchild;
L->rchild = (*P);

平衡二叉树是二叉排序树的一种优化形式,确保查找、插入和删除操作的时间复杂度为O(logn)。它通过限制左右子树高度差不超过1来保持平衡。在插入新结点后,如果发现最小不平衡子树,会通过旋转操作重新调整结构以恢复平衡。主要分为两种旋转:BF大于1时右旋,小于-1时左旋;若子树BF符号相反,则需要两次旋转来完成平衡操作。
最低0.47元/天 解锁文章
1256

被折叠的 条评论
为什么被折叠?



