我首先对新节点w执行标准BST插入,然后调用功能 addAVL 。然后从w开始,向上移动并找到第一个不平衡节点。然后根据需要将其发送到左右旋转。旋转功能和其他所有功能都可以正常工作,但是当我遇到“向左/向右”或“向右/向左”情况时,我无法弄清楚在第一次旋转后要发送的内容。如果有人可以提供建议/帮助,那就太好了。
我的问题是: 在LeftRight或RightLeft条件下执行第一次旋转后。我应将哪些节点发送到第二个轮播?
谢谢。
Node<T>* leftRotate( Node<T> *x,Node<T> *father)
{
Node<T> *y = x->rightSon;
Node<T> *T2 = y->LeftSon;
int check=0;
if(father!=NULL) {
check = (x == father->LeftSon);
}
y->LeftSon =x;
x->father = y;
x->rightSon=T2;
if(T2!=NULL)
x->rightSon->father=x;
y->height = max(height(y->LeftSon), height(y->rightSon))+1;
x->height = max(height(x->LeftSon), height(x->rightSon))+1;
if(father!=NULL) {
if(check)
{
father->LeftSon = y;
}
else {
father->rightSon = y; //new root
}
y->father = father;
}
else
{ this->head=y;
this->head->father=NULL;
}
return y; //return root
}
TREEResult addAVL(Node<T>* w,Node<T>* son)
{ if(w==NULL)
{
return FAILURE;
}
w->height=calculateNewHeight(w);
int bf=calculateBF(w);
if(bf==-2 && calculateBF(son)==-1 ) //RR
{
leftRotate(w,w->father);
return SUCCESS;
}
if(bf==2 && calculateBF(son)==-1 ) //LR
{
// ??
}
if(bf==-2 && calculateBF(son)==1 ) //RL
{
// ??
}
if(bf==2 && calculateBF(son)==1 ) //LL
{
rightRotate(w,w->father);
return SUCCESS;
}
addAVL(w->father,w);
}