Itératif BST insertion en C++

J'essaie de comprendre techniciennes se chargent et comment faire pour insérer des éléments dans il de manière itérative. Mon nœud de la structure de mise en œuvre ressemble à ceci:

struct Node{
    Node *left;
    Node *right;
    T data; //template class   
};

Et mon insertion de la mise en œuvre ressemble à ceci:

template<typename T>
bool BST<T>::Insert(const T value)
{
   Node *newNode = new Node;

   newNode -> data = value;
   newNode -> left = NULL; 
   newNode -> right = NULL;

   if(root == NULL) {root = newNode;} //If the BST is empty
   else 
   {//The BST is not empty 
      Node *ptr = root; //points to the current Node
      Node *ptr_parent; //points to the parent Node

      while(ptr != NULL)
      {
         if((ptr -> data) > value)
         {   
            ptr_parent = ptr;    
            ptr = ptr -> left;
         }

         if((ptr -> data) < value)
         {
            ptr_parent = ptr;
            ptr = ptr -> right;
         }
      }
    }

      ptr = newNode; //insert the newNode at the spot
      if((ptr_parent -> data) < value)
         ptr_parent -> right = newNode;
      else
         ptr_parent -> left = newNode; 

   return true;
}

L'insertion des œuvres lors de l'ajout du premier Nœud dans un arbre vide, mais j'obtiens une erreur de segmentation à chaque fois que j'ai essayer d'ajouter plus de Nœuds. Je comprends qu'il y a des messages qui montrent comment mettre en œuvre les insertions dans les techniciennes se chargent, mais la plupart d'entre eux montrent la méthode récursive, et ceux avec itératif exemples sont incomplètes ou trop spécifiques. Merci.

Quel est votre débogueur vous montrer?
De regarder, je suis presque certain que quelque chose de mal avec la façon dont je traverse l'arbre pour trouver le point d'insertion...
StarPilot: il ne dit Seg fault. Core dump j'utilise Vim pour compiler mon code
En regardant le code, je vois que sur la première insertion, vous définissez root à newNode. Ensuite, vous laissez le code de tomber. Donc, ptr = newNode; ptr_parent -> left = newNode; return true; sur la première passe. Si votre nœud racine a maintenant un left = itself. Ce n'est pas la mise en page que vous voulez. Comme traversant root -> left sera toujours revenir à lui-même et le résultat dans une boucle jusqu'à ce que le programme de coups. Lorsque vous définissez la racine, avoir juste return true; à partir de là et de voir ce qui se passe.

OriginalL'auteur Samuel | 2013-11-12