Dans l'ordre itérateur pour arbre binaire
Comment puis-je écrire un Java itérateur (c'est à dire les besoins de la next
et hasNext
méthodes) qui prend la racine d'un arbre binaire et parcourt les nœuds de l'arbre binaire en dans l'ordre de la mode?
- Je pense que la question est assez claire, si vous savez ce qu'est un arbre binaire, et qui ont l'expérience de l'analyse d'eux.
- Je pense que c'est de la vraie question bien. Il doit probablement avoir été fermé comme trop large à la place.
- C'est une vraie question. Je ne comprends vraiment pas certains des modérateurs, DONC.
Vous devez vous connecter pour publier un commentaire.
Le premier élément d'un sous-arbre est toujours le plus à gauche. Le prochain élément après élément est le premier élément de son sous-arbre droit. Si l'élément n'a pas un droit de l'enfant, l'élément suivant l'élément du premier ancêtre. Si l'élément n'a ni enfant ni un droit ancêtre, c'est l'élément le plus à droite et c'est la dernière dans l'itération.
J'espère que mon code est lisible par l'homme et couvre tous les cas.
Envisager l'arbre suivant:
a
ne dispose pas d'un droit de l'enfant, de sorte que l'élément suivant "jusqu'à ce que vous venez de gauche"b
n'ont un droit de l'enfant, ainsi, parcourirb
's sous-arbre droitc
n'a pas le droit de l'enfant. C'est le parent estb
, qui a été parcouru. Le prochain parent estd
, qui n'a pas été parcouru, donc arrêter ici.d
a un sous-arbre droit. Son élément le plus à gauche este
.g
n'a pas le droit de sous-arborescence, afin de marcher.f
a été visité, depuis que nous avons viennent de la droite.d
a été visité.d
n'a pas de parent, de sorte que nous ne pouvons pas nous déplacer plus loin. Nous avons parcouru à partir du nœud le plus à droite et nous nous sommes fait l'itération.Pour obtenir l'entrée suivante, 'nextEntry()', pour l'itérateur, j'ai regardé des extraits de
java.util.TreeMap
collé ci-dessous. En clair, je dirais que vous assurez-vous que le nœud racine est pas null première else return null. Si elle n'est pas, visitez le droit nœud si elle n'est pas null. Puis visite de la gauche (si ce n'est nulle) et de la visite que la gauche à plusieurs reprises dans une boucle while, avant de se heurter null. Si originial droit nœud est nulle alors au lieu de tout cela, visitez le nœud parent si ce n'est pas null. Entrez maintenant dans une boucle while, où vous visitez le parent jusqu'à ce qu'il soit null ou le nœud que vous êtes actuellement en visite a sa droite (enfant) nœud correspondant à votre dernière position. Maintenant de retour quelle que soit l'entrée que vous êtes sittng sur. À défaut de toutes les options, renvoyez le (original) nœud racine. 'HasNext()' vérifie simplement si cette "suivant", vous êtes de retour est null ou pas.C'est assez simple, à l'ordre de la traversée vous visitez la gauche de l'enfant si il y en a un, alors le nœud racine, puis le droit de l'enfant:
Diagramme:
next
ethasNext
méthodes), comment pouvez-vous intégrer une méthode récursive comme ça?