二叉排序树主要解决的是删除中的子节点的去向的问题
平衡二叉树
两个特点:
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;}
}