Comment puis-je effectuer une itération sur Arbre Binaire?
Droit maintenant, j'ai
private static void iterateall(BinaryTree foo) {
if(foo!= null){
System.out.println(foo.node);
iterateall(foo.left);
iterateall(foo.right);
}
}
Pouvez-vous changer à l'Itération au lieu d'une récursivité?
Je suis à la maison, mais ce n'est pas lié à mon travail.
J'ai voté le commentaire précédent, parce qu'il est plein de GAGNER 🙂
Votre DFS w/o d'une pile est complètement rompu. Vous la pile (ou, alternativement, une file d'attente, mais c'est ignorer que, pour l'instant), il n'y a pas moyen de contourner cela.
Il supprimé. Merci pour le tuyau.
La plupart des gens utilisent un arbre binaire de faire efficacement le tri par insertion. Sinon, ils utilisent une collection. Pour imprimer dans l'ordre de tri, vous devez effectuer une itération à gauche, imprimer le nœud, puis itérer droit.
J'ai voté le commentaire précédent, parce qu'il est plein de GAGNER 🙂
Votre DFS w/o d'une pile est complètement rompu. Vous la pile (ou, alternativement, une file d'attente, mais c'est ignorer que, pour l'instant), il n'y a pas moyen de contourner cela.
Il supprimé. Merci pour le tuyau.
La plupart des gens utilisent un arbre binaire de faire efficacement le tri par insertion. Sinon, ils utilisent une collection. Pour imprimer dans l'ordre de tri, vous devez effectuer une itération à gauche, imprimer le nœud, puis itérer droit.
OriginalL'auteur unj2 | 2010-05-31
Vous devez vous connecter pour publier un commentaire.
Vous pouvez, à l'aide d'une pile explicite. Pseudo:
Mais ce n'est pas vraiment supérieur à l'récursive code (sauf pour le manque condition de base dans votre code).
Ne voulez-vous pas pousser nœud.le premier à droite (de sorte qu'il devient sauté la dernière)?
Mon code n'est pas de préserver l'ordre de parcours. Vous avez raison de le faire, j'ai besoin d'inverser la poussée de l'ordre. Ou en fait, l'utilisation d'une file d'attente au lieu d'une pile.
OriginalL'auteur Konrad Rudolph
Ce que vous êtes à la recherche d'un successeur de l'algorithme.
Voici comment il peut être défini:
Comme vous pouvez le voir, pour ce travail, vous avez besoin d'un nœud parent pointeur.
Exemple:
(1)
(1)
n'a pas le droit de sous-arborescence, nous montons à(3)
. C'est un virage à droite, de sorte(3)
est à côté.(3)
a un sous-arbre droit, le nœud le plus à gauche dans ce sous-arbre est le suivant: la(4)
.(4)
n'a pas le droit de sous-arborescence, nous montons à(6)
. C'est un virage à droite, donc la prochaine est(6)
.(6)
a un sous-arbre droit, le nœud le plus à gauche dans ce sous-arbre est le suivant: la(7)
.(7)
n'a pas le droit de sous-arborescence, nous montons à(6)
. C'est un virage à gauche, donc nous continuons à aller jusqu'à(3)
. C'est un virage à gauche, donc nous continuons à aller jusqu'à(8)
. C'est un virage à droite, donc la prochaine est(8)
.(8)
a un sous-arbre droit, le nœud le plus à gauche dans ce sous-arbre est le suivant: la(10)
.(10)
a un sous-arbre droit, le nœud le plus à gauche dans ce sous-arbre est le suivant: la(13)
.(13)
n'a pas le droit de sous-arborescence, nous montons à(14)
. C'est un virage à droite, donc la prochaine est(14)
.(14)
n'a pas le droit de sous-arborescence, nous montons à(10)
. C'est un virage à gauche, donc nous continuons à aller jusqu'à(8)
. C'est un virage à gauche, nous voulons continuer de monter, mais depuis(8)
n'a pas de parent, nous avons atteint la fin.(14)
n'a pas de successeur.Pseudo-code
Code Java
Voici une simple mise en œuvre de l'algorithme ci-dessus:
Alors vous pouvez avoir un harnais de test comme ceci:
Cette affiche:
Voir aussi
Cela ne veut pas utiliser la récursivité.
Il y a un code Java pour vous.
OriginalL'auteur polygenelubricants
Sûr, vous avez deux algorithmes généraux, parcours en profondeur d'abord de recherche et largeur de recherche.
Si l'ordre de parcours n'est pas important pour vous, allez pour la largeur d'abord, il est plus facile à mettre en œuvre pour l'itération. Vous êtes algorithme devrait ressembler à quelque chose comme ça.
while (!queue.isEmpty()) {
.Oui, vous avez raison, merci
OriginalL'auteur Ivan
Comme à chaque récursion, vous pouvez utiliser la structure de données supplémentaires - c'est à dire de la pile.
Un esquisse de la solution:
Hmmm..., afin De préserver le même ordre de visite? Si vous avez poussé la gauche d'abord et seulement ensuite celui de droite, vous pop le droit d'abord, puis celui de gauche. Dernier entré, premier sorti, non?
OriginalL'auteur Grzegorz Oledzki
Oui, vous pouvez le modifier à l'itération au lieu de la récursivité, mais alors il devient beaucoup plus compliqué, car vous avez besoin d'avoir un moyen de se rappeler où aller retour à partir du nœud courant. Dans le récursive cas, la Java de la pile d'appel des poignées, mais dans un processus itératif de solution dont vous avez besoin pour construire votre propre pile, ou peut-être magasin retour des pointeurs dans les nœuds.
OriginalL'auteur Thomas Padron-McCarthy
J'ai eu un arbre (non binaire) et finalement résolu avec cet algorithme très simple. Les solutions utilisées gauche et droit qui n'étaient pas pertinents ou même mis en œuvre dans les exemples.
Ma structure a été: des noeuds avec chaque parent contenant la liste des enfants, et chaque enfant contenant un pointeur à la maison mère. Assez commun...
Après un tas de refactoring, je suis venu avec l'exemple suivant à l'aide de Kotlin. Il doit être facile à convertir à la langue de votre choix.
Des Fonctions D'Assistance
Tout d'abord, le nœud doit fournir 2 fonctions simples. Cela peut varier en fonction de votre classe de Nœud de mise en œuvre:
gauche - C'est le premier nœud enfant. Si le nœud a des enfants, c'est d'abord un enfant, etc. Si pas d'enfants, de retour ce.
nextSibling - Le prochain fils de ce nœud, ou NULL
L'Itération
L'itération commence avec le bouton de gauche de la racine.
Puis inspectez le frère suivant.
.
Ici est un Kotlin fonction d'itérateur.
Ici est la même fonction next (), mais sans le Kotlin d'abréviation pour traiter avec des valeurs NULLES, pour ceux qui ne sont pas de la hanche à la syntaxe.
OriginalL'auteur Steven Spungin