Rien de mieux pour faire les vacances de Noël, j'ai donc décidé d'essayer de faire un arbre de recherche binaire. Je suis coincé avec la fonction d'impression. Comment devrait fonctionner la logique derrière cela? Puisque l'arbre l'insère déjà dans un ordre quelque peu trié, et je veux imprimer l'arbre des plus petites valeurs au plus grand. J'ai donc besoin de voyager jusqu'à la branche la plus à gauche de l'arbre pour imprimer la première valeur. Bon, alors après, comment est-ce que je me souviens du chemin de retour, ai-je besoin de sauvegarder le nœud précédent? Une recherche dans wikipedia m'a donné une solution qu'ils utilisaient pile. Et d'autres solutions que je n'arrivais pas à comprendre comment ils l'ont fait, alors je demande ici plutôt que quelqu'un puisse m'éclairer.C++ imprimer un arbre de recherche binaire
Je me demande également si ma fonction d'insertion est OK. J'ai vu la solution d'un autre être plus petite.
void treenode::insert(int i)
{
if(root == 0)
{
cout << "root" << endl;
root = new node(i,root);
}
else
{
node* travel = root;
node* prev;
while(travel)
{
if(travel->value > i)
{
cout << "travel left" << endl;
prev = travel;
travel = travel->left;
}
else
{
cout << "travel right" << endl;
prev = travel;
travel = travel->right;
}
}
//insert
if(prev->value > i)
{
cout << "left" << endl;
prev->left = new node(i);
}
else
{
cout << "right" << endl;
prev->right = new node(i);
}
}
}
void treenode::print()
{
node* travel = root;
while(travel)
{
cout << travel->value << endl;
travel = travel->left;
}
}
chose drôle cela fonctionne. Pas si drôle, c'est que je ne comprends pas ... Je déteste la récursion ... – starcorn
@starcorn - Si vous vous sentez comme ça à propos de la récursivité, ma suggestion serait de laisser tomber ce projet et de prendre des programmes d'écriture en Lisp pendant un moment vous êtes à l'aise avec cela. Il y a des raisons de l'éviter à l'occasion, mais pour être un récurseur vraiment expert, la récursivité doit être dans votre boîte à outils. –
@starcorn - pour la récursion non initiés peut être décourageant - la plupart d'entre nous passer par là! Voici un moyen facile de comprendre la récursivité - le "crux" d'un appel récursif n'est pas dans la récursivité elle-même, mais plutôt dans les "cas de fin", à savoir, les parties du code qui s'exécutent quand vous ne voulez pas faire un appel récursif. Commencez par essayer de comprendre les fonctions d'impression - la différence de version postorder, précommande et inorder. Une recherche rapide a montré cette page Web http://www.cs.umd.edu/class/spring2002/cmsc214/Tutorial/recursion.html – Abhi