二叉排序树主要解决的是删除中的子节点的去向的问题
平衡二叉树
两个特点:
1.左右子树的深度的差的绝对值不超过1
2.左右子树也是平衡二叉树
BF(BlanceFactor)=左-右(BF-)
二叉树因插入导致平衡破坏的调整(不更改中序遍历的结果)
RR:对B逆时针旋转


LL:同理
LR:
插入前


先对B及其右子树转成LL

再使用LL的顺时针:

调整后:


绘图软件
例题:



void RR_rotate(BBSTNode *a)//只需要传入关键节点a
{ BBSTNode *b;
b=a->Rchild;//a的右子树
a->Rchild=b->Lchild;//最终a的右子树的左子树变为a的右子树
b->Lchild=a;
a->Bfactor =b-->Bfactor=0;
a=b;
}
void LL_rotate(BBATNode *a)
{ BBATNode *b;
b=a->Lchild;a->Lchild=b->Rchild;
b->Rchild=a;
a->Bfactor =b-->Bfactor=0;a=b;
}


void LR_rotate(BBATNode *a)
{ BBATNode *b,*c;
b=a->Lchild;c=b->Rchild;/*初始化*/
a->Lchild=c->Rchild; b->Rchild=c->Lchild;
c->lchild=b;c->Rchild=a;
if(c->Bfactor==1)
{
a->Bfactor=-1;b->Bfactor=0;
}
else if(c->Bfactor==0)
a->Bfactor=b->Bfactor=0;
else{a->Bfactor=0;b->Bfactor=1;}
}
void LR_rotate(BBATNode *a)
{ BBATNode *b,*c;
b=a->Lchild;c=b->Rchild;/*初始化*/
a->Lchild=c->Rchild; b->Rchild=c->Lchild;
c->lchild=b;c->Rchild=a;
if(c->Bfactor==1)
{
a->Bfactor=-1;b->Bfactor=0;
}
else if(c->Bfactor==0)
a->Bfactor=b->Bfactor=0;
else{a->Bfactor=0;b->Bfactor=1;}
}
10,20,30,90,50

本文详细介绍了平衡二叉排序树的概念,特别是其两大特性:左右子树深度差不超过1以及子树也保持平衡。文章通过示例展示了RR、LL、LR旋转操作,用于在插入元素后维护树的平衡,确保搜索效率。同时,提供了具体的旋转函数实现,如RR_rotate、LL_rotate和LR_rotate,并给出了示例数据(10,20,30,90,50)的处理策略,强调了调整过程中对中间节点的处理和顺序的重要性。
3361

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



