Метод удаления C ++ AVLtree

0

Я действительно зациклился на том, как реализовать метод удаления для avltree в C++. Я не уверен, с чего начать. У меня есть методы, чтобы найти узел, методы вращения и вставку, но просто не знаю, как начать этот метод удаления. Я знаю, что это расплывчато, и есть ресурсы в Интернете, но я не нахожу их очень ясными. Может кто-нибудь объяснить, пожалуйста, процесс?

Если есть какой-либо код, который вы хотели бы видеть, пожалуйста, спросите:

Будем очень благодарны за любые советы. Спасибо заранее!

----- РЕДАКТИРОВАТЬ -----

Найти метод узла:

Node* AVLtree::findNode(string cityID){
       Node *thisNode = this->rootNode;
       while(thisNode!=0){            
             int location = thisNode->getCity()->getName().compare(cityID);
             if(location==0){return thisNode;
             }else if(location<0){//cout<<"NODE: " << thisNode->getCity()->getName()<<endl;
             thisNode = thisNode->getChildR();
             }else{thisNode = thisNode->getChildL();}  
       }
       return thisNode; 
       }

Поверните влево:

  Node* AVLtree::rotateLeft(Node* node){
       Node* tempParent= node->getParent();
       Node* tempNode = node->getChildL();
       node->setChildL(tempNode->getChildR());
       tempNode->setChildR(node);

       if(tempParent==0){tempNode->removeParent();this->rootNode=tempNode;tempNode->getNewHeight();}
       else{tempParent->setChildR(tempNode);
            }
       return tempNode;
       }

Поверните направо:

  Node* AVLtree::rotateRight(Node* node){
       Node* tempParent = node->getParent();
       Node* tempNode = node->getChildR();
       node->setChildR(tempNode->getChildL());
       tempNode->setChildL(node);

       if(tempParent==0){tempNode->removeParent();this->rootNode=tempNode;tempNode->getNewHeight();}
       else{tempParent->setChildR(tempNode);}

       return tempNode;
       }

Двойное вращение, когда при вставке в левое поддерево правого дочернего узла неуравновешенности:

  Node* AVLtree::rotateTwoRights(Node* node){
        node = rotateLeft(node->getChildR());
        node = rotateRight(node->getParent());
        return node;
        }

Двойное вращение для правого, левого состояния:

  Node* AVLtree::rotateTwoLefts(Node* node){
        node = rotateRight(node->getChildL());
        node = rotateLeft(node->getParent());
        return node;
        }

Метод вставки:

Node* AVLtree::insertNode(Node* parent, Node* node, City *city, int side){
       if(node == 0){
               if(side==0){
                     node = parent->setChildL(new Node(city));
               }else if(side==1){
                     node = parent->setChildR(new Node(city));
               } 
       }else if(node->getCity()->getName().compare(city->getName())<0){ //Right case
             parent = node;
             node = insertNode(parent, node->getChildR(), city, 1);
             parent->getNewHeight();
             if(parent->getBalance()==2){
                   if(parent->getChildR()->getCity()->getName().compare(city->getName())<0){
                         node = rotateRight(parent);
                   }else{
                         node = rotateTwoRights(parent);
                   }                                
             }
       }else if(node->getCity()->getName().compare(city->getName())>0){ //Left case
             parent = node;
             node = insertNode(parent, node->getChildL(), city, 0);
             parent->getNewHeight();
             if(parent->getBalance()==-2){
                   if(parent->getChildL()->getCity()->getName().compare(city->getName())>0){
                         node = rotateLeft(parent);
                   }else{
                         node = rotateTwoLefts(parent);
                   }
             }    
       }else{
             node=0;
       }
       return node;
       }
  • 0
    Подсказка: всегда удаляйте на уровне листа.
  • 0
    Вы имеете в виду смещение всех узлов вверх, чтобы удаляемый узел находился внизу?
Показать ещё 3 комментария
Теги:
avl-tree

1 ответ

0

В Интернете много примеров таких алгоритмов, объясненных абстрактно.

Конкретную помощь трудно обеспечить без исходного кода, так как я понятия не имею, что вы назвали своими методами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню