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.
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
Vous devez vous connecter pour publier un commentaire.
J'ai pu faire mon premier code du travail la nuit dernière, je partage la réponse ici:
Pour l'amour de moi que je voulais résoudre ce sans l'aide de double pointeurs.
bien sûr, il est mondial. Le code jeter erreur de compilation autrement.
OriginalL'auteur Samuel
Je pense que je ferais les choses un peu différemment. Tout d'abord, je voudrais simplifier le code des autres un peu en ajoutant un ctor à la classe de Nœud:
Ensuite, vous pouvez utiliser un pointeur vers un pointeur pour parcourir l'arbre et insérer l'élément:
Notez que j'ai retardé la création de la nouvelle nœud jusqu'à ce qu'après que nous avons laissé tomber hors de la boucle. De cette façon, si nous avons un double élément, on peut juste retour (sans fuite d'un nœud, puisque nous n'avons alloué un nouveau nœud encore).
Pour ce que ça vaut, si vous alliez faire cela de façon récursive, il serait probablement plus facile d'utiliser une référence à un pointeur au lieu d'un pointeur vers un pointeur.
OriginalL'auteur Jerry Coffin
Vous n'avez pas gérer le cas lorsque
ptr->data == value
donc la boucle est infinie à chaque fois qu'un doublon est trouvé, etptr = newNode
ne fait rien, il fait justeptr
point denewNode
. Essayez cettePS: merci pour le tuyau sur le double de cas. J'ai oublié à ce sujet
Vous pouvez éviter la double pointeur à l'aide de 2 pointeurs que ce que vous avez fait.
OriginalL'auteur Shubham
L'utilisation de pointeurs
Lorsque vous essayez de faire de cette
il ne fait pas de anyithing car vous avez besoin de modifier le pointeur qui pointe vers la gauche ou la droite sous-nœud
quelque chose comme ceci:
bst.h:103:21: erreur: demande de membre de la "gauche" en* ptr, qui est de la non-type de classe ‘INTENS<int>::Node*’ bst.h:109:21: erreur: demande de membre de la ‘droite’ in ‘* ptr, qui est de la non-type de classe ‘INTENS<int>::Node*’
OriginalL'auteur DalekSupreme
Que je comprends, c'est un échec à cause de la ligne suivante:
après la boucle while votre pointeur est NULL sinon vous ne pouvez pas sortir de la boucle while. L'affectation d'une structure à NULL, ce qui n'est pas droit.
J'espère que cela aide. Tout le reste semble normal.
N'est-ce pas juste faire
ptr
à point ànewNode
? Comment est-il de l'erreur?OriginalL'auteur printfmyname
OriginalL'auteur Hrachya_h
J'ai répondu à un cas ici Un Arbre de Recherche binaire d'insertion ne fonctionne pas voir si elle aide les
OriginalL'auteur Jegan Babu