2017-05-24 1 views
-3

J'ai la classe suivante:C++ paramètre noeud père dans un arbre

class Node 
{ 
    private: 
    Node* leftChild; 
    Node* rightChild; 
    Node* father; 
    public: 
    Node() { leftChild = rightChild = father = NULL; };  
    Node* getLeftChild() { return leftChild; }; 
    Node* getRightChild() { return rightChild; }; 
    Node* getFather() { return father; } 
    void setRightChild(Node* child) { rightChild = child; } 
    void setLeftChild(Node* child) { leftChild = child; }; 
    void setFather(Node* f) { father = f; }; 
}; 

Je mettrais également le noeud père lors de la mise à l'enfant gauche et l'enfant droit. J'essaie:

void setLeftChild(Node* child) 
{ 
    leftChild = child; 
    child->setFather(this); 
};  

Node* node = new Node(); 
Node* node2 = new Node(); 

node->setLeftChild(node2); 

et en raison de la mauvaise utilisation de cela, je reçois une erreur aléatoire. Comment dois-je définir la fonction setLeftChild() et setRightChild()? Merci.

+0

Pourquoi pas un nœud mère? C'est sexiste. C'est pourquoi nous l'appelons parent. * déclenché * – arminb

+0

S'il vous plaît donner des détails de l'erreur – noelicus

+0

vous pourriez le trouver ** beaucoup ** plus facile à utiliser un conteneur standard tel que ['std :: deque <>'] (http://en.cppreference.com/ w/cpp/container/deque) –

Répondre

0

De toute évidence, votre

node->setLeftChild(node); 

produira un non-sens. Vous devez soit écrire un code valide ou (au moins en mode debug) garde contre de telles absurdités

void setLeftChild(Node* child) 
{ 
    if(child==this) 
    throw std::runtime_error("node cannot be its own child"); 
    leftChild = child; 
    child->setFather(this); 
};  

Une autre idée est de faire father un membre immuable qui doit être fourni à la construction (et égale nullptr seulement pour le nœud racine), c'est-à-dire

struct Node 
{ 
    Node*const father;  // immutable, so might as well be public 
    Node(Node*f) : father(f) {} 
    Node*MakeLeftChild() // create left child and return it 
    { 
    if(!leftChild) 
     leftChild = new Node(this); 
    return leftChild; 
    } 
    Node*MakeRightChild() // create right child and return it 
    { 
    if(!rightChild) 
     rightChild = new Node(this); 
    return rightChild; 
    } 
private: 
    Node*leftChild=nullptr; // defaults to having no children 
    Node*rightChild=nullptr; 
}; 

auto root = new Node(nullptr); 
auto node = root->MakeLeftChild(); 
node = node->MakeRightChild(); 
+0

si j'écris child-> setFather (this); le programme se coince. – Discipulos