2010-12-23 6 views
1

salut J'écrivais un BST et ai écrit la fonction suivante pour ajouter l'enfant.Quel est le problème avec cette fonction

void addChild(T value) 
{ 
    temp = root; 
    while(0 != temp) 
    { 
    temp1 = temp; 
    if(value > temp->getValue()) 
      temp = temp->getRightChild(); 
     else 
      temp = temp->getLeftChild(); 
    } 
    if(temp1->getValue() > value) 
    { 
     temp1->setRightChild(new Child(value)); 
    } 
    else 
    { 
     temp1->setLeftChild(new Child(value)); 
    } 
} 

Je donne "23 12 122 1 121 15" comme entrée. La racine est le noeud 23 que je crée dans le constructeur de la classe.

Problème: Lorsque je fais une traversée d'arbre, je ne reçois que 23 et 15 comme sortie. Question: Qu'est-ce que je fais de mal dans cette fonction?

+0

peut-être y a-t-il un problème avec votre fonction de traversée? De plus, je ne vois pas de déclaration pour les variables 'temp' et' temp1'. Sont-ils globaux ?? Quoi qu'il en soit, je suggère d'utiliser un débogueur (par exemple 'gdb') pour suivre le code. Il devrait être assez simple de trouver le problème – davka

Répondre

1

Essayez:

if(value > temp1->getValue()) 

... sinon votre état d'insertion diffère de votre recherche d'un endroit dans la boucle au-dessus.

+0

Ne devrait-il pas ajouter un if (root == null) return; au début de la fonction, aussi bien? – Muggen

+0

@Muggen - peut-être 'if (root == null) {root = new Enfant (valeur); return;}' - mais il mentionne que root a été défini dans son constructeur. – sje397

1

Les conditions sont mélangées.

si (valeur> tentation> getValue()): getRight

est à l'opposé de

si (temp1-> getValue()> valeur): Setright

Essayez simplement changer la dernière condition.

0

Je suis d'accord avec les réponses précédentes de Captain et sje, mais elles n'expliquent pas la sous-population sévère, devrions-nous dire, de votre arbre. Le problème possible est que vous ajoutez la valeur en tant qu'enfant de temp1, en supprimant complètement l'enfant précédent. Cela est probablement fait dans les fonctions T :: setRightChild() et T :: setLeftChild().

+0

La condition incorrecte explique les résultats: si vous recherchez et trouvez que vous devez ajouter un enfant correct, puis ajoutez un nouvel enfant gauche (en écrasant éventuellement le pointeur sur un groupe d'enfants existants), vous perdrez des données (et une mémoire de fuite) . Si vous voulez dire qu'il devrait y avoir une vérification de cette possibilité, c'est probablement une bonne chose. – sje397

+0

Difficile de dire ce qui se passe à l'extérieur. Cette fonction nécessite un certain nombre de conditions préalables pour fonctionner correctement. –

Questions connexes