Comment le faire dans l'ordre de la traversée d'un BST sans récursivité et pile mais à l'aide de parent pointeurs?
Est-il possible de faire un processus itératif dans l'ordre-de la traversée sur un BST dont le nœud a un parent pointeur (le parent de la racine est null
) sans l'aide d'un visited
drapeau ou un stack
?
J'ai googlé et n'ai pas trouvé une réponse. Le point est, comment puis-je savoir à un certain nœud - que je viens de vs, j'ai tout fini en dessous?
La récursivité? Si c'est une indirectes de l'utilisation de piles.
Cela ressemble à un de ces stupides questions de l'entrevue. La récursivité est le plus probable de la réponse attendue.
[@Shubham, @pablochan] Si vous lisez de nouveau la question, vous trouverez le mot itératif écrit explicitement.
Eh bien la réponse est non (sauf si vous pouvez enregistrer les nœuds visités quelque part)
êtes-vous sûr? Je pense que vous pouvez faire, voir ma réponse.
Cela ressemble à un de ces stupides questions de l'entrevue. La récursivité est le plus probable de la réponse attendue.
[@Shubham, @pablochan] Si vous lisez de nouveau la question, vous trouverez le mot itératif écrit explicitement.
Eh bien la réponse est non (sauf si vous pouvez enregistrer les nœuds visités quelque part)
êtes-vous sûr? Je pense que vous pouvez faire, voir ma réponse.
OriginalL'auteur OmarOthman | 2012-04-29
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire, vous avez juste besoin de se rappeler la dernière visite du nœud avec le nœud courant. Ce n'est pas rejetée par l'énoncé du problème: les deux
visited
drapeau sur chaque nœud et unstack
sont (pire des cas) S(n), se souvenant de la dernière nœud est juste O(1).En C#, l'algorithme pourrait ressembler à ceci:
Non, il ne sera pas. Notez que la branche de droite est dans un
if
, paselse if
. Si, Après son entrée sur le côté gauche (dans lalastNode == node.Left
branche), il cherche immédiatement à droite (lastNode == node.Right
) et seulement après qu'il passe en boucle sur.Si vous avez besoin d'un parent pointeur, il est impossible de faire autrement?
vous pouvez également utiliser une tige filetée de l'arbre. Si vous voulez éviter la pile et de la mère de pointeurs.
OriginalL'auteur
Ici est une autre façon de faire. Je pense que c'est essentiellement équivalent à svick réponse, mais évite la variable supplémentaire. Cette version est implémenté en Python:
Quel que soit le nœud que vous avez visité dernier détermine le nœud suivant que vous devez visiter. Si vous venez de visiter nœud X, alors vous avez besoin pour visiter les plus à gauche du nœud à droite de X. Si X n'a pas le droit de l'enfant, puis le nœud suivant est le premier ancêtre, où nœud X n'est pas venu de la droite.
Je ne vois pas de boucle infinie dont vous parlez. Quand il traverse la plus à droite du nœud, puis la dernière boucle de le renvoyer à la racine, et enfin définir le nœud pour le parent de la racine, ce qui devrait être nul. L'extérieur tandis que la boucle serait alors à l'arrêt.
Agréable et propre de mise en œuvre +1
Testé un arbre binaire en tant que root = 2, left = 1 et la droite = 3. Il ne fonctionne pas et ne produisent que le nœud de gauche.
Je n'arrivais pas à reproduire le problème. Il semble fonctionner ok: codepad.org/njxp5tba
OriginalL'auteur
À l'aide de svick'idée correcte (voir son réponse), c'est le testé code en C++. Notez que je n'ai pas tester son code ou même de prendre un coup d'oeil, j'ai juste pris son idée et mis en place ma propre fonction.
OriginalL'auteur
OriginalL'auteur
Ma solution Java sans introduire aucun indicateur sur l'ARBRE existant. Et aucun parent ne pointeur. Cette approche permettra de tenir les nœuds jusqu'à la hauteur de l'arbre. Jetez un coup d'oeil.
https://github.com/skanagavelu/Algorithams/blob/master/src/tree/InOrderTraversalIterative.java
OriginalL'auteur
Étape 1 : écrire une fonction qui retourne dans l'ordre successeur
Étape 2 : à Partir du nœud le plus à gauche, trouver le dans l'ordre successeur jusqu'à ce qu'il n'y a aucun
OriginalL'auteur
La clé est la mère des pointeurs (ou la capacité de muter de l'arbre), mais vous avez besoin d'une quantité constante de supplémentaires de l'état (par exemple, le compteur de programme de la suite de coroutine).
OriginalL'auteur
C'est en C++:
OriginalL'auteur