Recherche d'exemples sur des itérations d'arbre simples en C++, à la fois récursives et itératives. (post, pre et in-order)itérations d'arbre C++
Répondre
This page montre un exemple d'arbre binaire et comment l'itérer.
La bibliothèque Adobe Source Library adobe::forest<T>
est un conteneur générique pouvant être itéré en amont ou en aval. La documentation contient des exemples d'exécution de ces différents types d'itérations.
si votre arbre ressemble à ceci:
struct Node{
Node *left, *right, *parent;
int value; // or some other important data :-)
}
alors c'est la façon dont vous faites une récursive en ordre itération:
void iterate(Node *n){
if(!n)
return;
iterate(n->left);
cout << n->value; // do something with the value
iterate(n->right);
}
Si vous changez les lignes avec n> gauche et n -> à droite l'arbre sera itéré dans l'ordre inverse.
Ce sont les pré-commande et itérations post-ordre:
void iterate_pre(Node *n){
if(!n)
return;
cout << n->value; // do something with the value
iterate_pre(n->left);
iterate_pre(n->right);
}
void iterate_post(Node *n){
if(!n)
return;
iterate_post(n->left);
iterate_post(n->right);
cout << n->value; // do something with the value
}
L'itération non récurrent est un peu plus compliqué. La première chose dont vous avez besoin est de trouver un premier noeud dans l'arbre (comme vector<T>::begin()
)
Node *find_first(Node *tree){
Node *tmp;
while(tree){
tmp = tree;
tree = tree->left
}
return tmp;
}
Ensuite, vous avez besoin d'un moyen d'obtenir l'élément suivant de l'arbre (vector<T>::iterator::operator++()
).
Node *next(Node *n){
assert(n);
if(n->right)
return find_first(n->right)
while(n->parent && n->parent->right == n)
n = n->parent;
if(!n->parent)
return NULL;
return n;
}
(cette fonction essaie de trouver un premier noeud dans le sous-arbre droit et si ce n'est pas possible, monte l'arbre jusqu'à ce que le chemin vient du sous-arbre à droite)
- 1. itérations complexes dans haskell
- 2. Optimisation des itérations foreach indépendantes dans .NET3.5
- 3. Meilleur ensemble de noms pour les itérations?
- 4. Comment faire des itérations sur des colonnes inconnues dans XSLT
- 5. Ordre de calcul et itérations pour les moteurs physiques
- 6. itérations multiples de la sélection de tournoi dans l'algorithme génétique
- 7. Suppression après quelques itérations: oui | rm -r .git
- 8. Radix Sort implémenté en C++
- 9. Bibliothèque Eye-Tracking en C#, C/C++ ou Objective-C
- 10. Comportement étrange de stdout en C++
- 11. fichier virtuel? en c/C++ ou C#
- 12. Astuces pInvoke C#/C++
- 13. appdomain C++ C#
- 14. auto c/C++
- 15. Migration Borland C++ C#
- 16. Décompilateur C/C++ opensource
- 17. Diagramme en C/C++
- 18. Console C/C++ Windows WIN32
- 19. Interopérabilité Objective-C et C
- 20. SendInput() Clavier lettres C/C++
- 21. C# C équivalent à l'union
- 22. Meilleure bibliothèque réseau C/C++
- 23. large exec pour C/C++
- 24. C# à C non géré ++
- 25. Appel fonction C++ de C#
- 26. Problème de mémoire C/C++?
- 27. C# Convert.ToInt16 (Chaîne) C Équivalent
- 28. Communication RDP via C/C++
- 29. traduire C++/CLI en C#
- 30. Interop entre C++ et C#
Votre iterate_pre et iterate_post devraient s'appeler au lieu d'itérer. – sbk
Vous avez raison, merci :-) – cube