2017-10-17 20 views
-1

Implémentation d'une classe C++ pour un nœud, mais je reçois toujours une erreur lors de la suppression d'un nœud.Déplacement en C++ des enfants d'un nœud supprimé vers son parent dans un arbre

Le algorithim général va comme ceci:

  • mis la PARENT_ de l'enfant à PARENT_
  • ajouter l'enfant aux enfants du parent
  • retirer l'enfant des enfants de ce noeud

Voici mon fichier de classe:

template <typename E> 
class TNode{ 

    ... 

bool remove(){ 
      if ((parent_==NULL) && (children_.size()>0)){ 
       cout << "can't remove the root if it has children\n"; 
       return false; 
      } 
      else{ 

       parent_->children_.erase(std::remove(parent_->children_.begin(), parent_->children_.end(), this), parent_->children_.end()); 

       for (int i=children_.size()-1;i>=0; i--){ 

        //my error is happening here 

        parent_ = parent_ -> children_; 
        this = children_ -> this; 
        parent_ = parent_ -> this; 
       } 

       //delete (deallocate memory of) this node 
       delete this; 
       return true; 
      } 
     } 

     friend class gTree<E>; 

     private: 
     E data_; 
     gTNode<E>* parent_; 
     std::vector<gTNode<E>*> children_; 
    }; 

Quelqu'un peut-il me diriger dans la bonne direction?

EDIT L'erreur est la suivante:

gTree.h: In member function ‘bool gTNode<E>::remove()’: 
gTree.h:50:29: error: expected unqualified-id before ‘this’ 
     this = children_ -> this; 
          ^
gTree.h:50:29: error: expected ‘;’ before ‘this’ 
gTree.h:51:30: error: expected unqualified-id before ‘this’ 
     parent_ = parent_ -> this; 
          ^
gTree.h:51:30: error: expected ‘;’ before ‘this’ 
+0

voir les modifications ci-dessus – nickoba

Répondre

0

La mise en œuvre est tout faux. Je vois plusieurs erreurs dans ce code. Comme remove() accéder à un parent_ NULL lorsqu'il est appelé sur un nœud racine sans enfants. Et la boucle ne prend pas correctement en compte vector::size() étant non signé. Et juste des erreurs de syntaxe générales.

Essayez quelque chose comme ceci:

template <typename E> 
class gTNode 
{ 
    ... 
    bool remove() 
    { 
     if (parent_) 
     { 
      auto iter = std::find(parent_->children_.begin(), parent_->children_.end(), this); 
      auto index = std::distance(parent_->children_.begin(), iter); 
      parent_->children_.erase(iter); 
      if (!children_.empty()) 
      { 
       parent_->children.reserve(parent_->children_.size() + children_.size()); 
       parent_->children_.insert(parent_->children.begin() + index, children_.begin(), children_.end()); 
       for (auto *child : children_) 
        child->parent_ = parent_; 
       children_.clear(); 
      } 
     }  
     else if (!children_.empty()) 
     { 
      cout << "can't remove the root if it has children\n"; 
      return false; 
     } 

     //delete (deallocate memory of) this node 
     delete this; 
     return true; 
    } 

    friend class gTree<E>; 

private: 
    E data_; 
    gTNode<E>* parent_; 
    std::vector<gTNode<E>*> children_; 
}; 
+0

@nickoba le code que je montrais ne change pas l'ordre des enfants, de sorte que l'entrée devait être dans cet ordre pour commencer –

+0

est là un moyen de changer l'ordre lors de la suppression d'un noeud? – nickoba

+0

@nickoba bien sûr, vous pouvez utiliser l'ordre que vous voulez. Mais pourquoi changer la commande? Sauf si les enfants sont censés être triés. –