AVL树插入LR / LR旋转

时间:2018-12-06 16:25:33

标签: c++ tree

我首先对新节点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);
    }

0 个答案:

没有答案