Сначала я выполняю стандартную вставку BST для нового узла w, затем вызываю функцию 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);
}