AVL Деревья LR / LR вращения - PullRequest
       0

AVL Деревья LR / LR вращения

0 голосов
/ 06 декабря 2018

Сначала я выполняю стандартную вставку 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...