2009-10-01 6 views
0

J'apprends le C++ et j'écris un arbre de recherche binaire. Ce qui suit est le code que j'ai écrit pour ma méthode d'insertion.Insert BST en C++

BSTNode * BST::Insert(const std::string & v) { 
    BSTNode *n = !root ? root = new BSTNode(v) : Insert_Helper(v,root); 
    if(n) size++; 
    return n; 
} 

BSTNode * BST::Insert_Helper(const std::string & v, BSTNode *n) { 
    if(!n->value.compare(v)) 
     return NULL; // already have v 
    else if(n->value.compare(v) > 0) // v goes to the left 
     if(n->left) return Insert_Helper(v,n->left); 
     else return n->left = new BSTNode(v); 
    else // v goes to the right 
     if(n->right) Insert_Helper(v,n->right); 
     else return n->right = new BSTNode(v); 
} 

Le bug que je reçois va comme ceci: tout cela fonctionne bien et dandy, jusqu'à ce que je tente d'insérer un nœud double. Il n'ajoute pas de nouveau noeud, mais il incrémente le nombre. En observant dans GDB, j'ai constaté que lorsque j'essaie d'ajouter une chaîne que j'ai déjà, Insert_Helper fonctionne correctement et renvoie NULL. Cependant, cette valeur (sur ma machine) est quelque chose comme 0x6, qui est hors limites bien sûr, mais pas 0x0 comme je pensais que ce serait. Je pense que cela cause un problème au point où j'ai l'instruction if (n). Dans ce cas, n est évalué à "true" et augmente donc d'un cran la taille d'un.

En outre, à ce stade de mon programme, les nœuds continuent d'être ajoutés correctement, mais ma fonction d'insertion continue de renvoyer 0x6 comme adresse, même s'ils sont réellement dans des emplacements valides en mémoire auxquels je peux accéder. Est-ce que quelqu'un peut me donner des indications sur ce que je pourrais faire de mal?

+0

FYI, vous auriez un temps plus facile avec si vous aviez une seule sortie et plus d'espaces. –

Répondre

6

Votre compilateur devrait probablement repéré, mais cette ligne à la fin de votre aide:

if(n->right) Insert_Helper(v,n->right);

Vous devriez probablement revenir tout Insert_Helper rendement:

if(n->right) return Insert_Helper(v,n->right);

+0

Classique. Sensationnel. Une heure de ma vie passée. Mais, aurait pu être pire - merci beaucoup. – Jarsen

0

Vous pouvez modifier if(n) size++ à if (n != NULL) size++

+1

Comment cela va-t-il aider? – Amok

+0

On dirait qu'il évalue à la même chose. Merci quand même. – Jarsen

+0

De la publication originale "Insert_Helper ... renvoie NULL, cette valeur (sur ma machine) est quelque chose comme 0x6, qui est hors limites, bien sûr, mais pas 0x0 comme je pensais que ce serait." Il semble que NULL ait été défini à 0 et que Insert_Helper ne soit pas retourné correctement sur un chemin de code. Mais si NULL avait été autre chose que 0, alors (n) signifierait autre chose que if (n! = NULL). –