Ich habe vor kurzem eine Reihe von verschiedenen binären Suchbaum Implementierungen Codierung bis (AVL, spreizen, Treap) und bin neugierig, ob es eine besonders „gute“ Weg, einen Iterator zu schreiben, diese Strukturen zu durchqueren. Die Lösung, die ich jetzt verwendet habe, ist jeder Knoten in den BST speichern Zeiger auf die nächsten und vorherigen Elemente in dem Baum zu haben, die Iteration zu einer Standard-linked-Liste Iteration reduziert. Allerdings bin ich nicht wirklich mit dieser Antwort zufrieden. Es erhöht die Raumnutzung jedes Knotens durch zwei Zeiger (nächste und vorherige), und in gewissem Sinne betrügen es ist einfach.
Ich kenne einen Weg, um einen binären Suchbaum Iterator zu bauen, die O (h) Hilfsspeicherraum verwendet (wobei h die Höhe des Baumes ist) durch einen Stapel unter Verwendung Spur des Grenzknoten zu halten später zu erforschen, aber ich ve widerstanden Codierung dies wegen der Speichernutzung auf. Ich habe gehofft, es gibt einen Weg einen Iterator zu bauen, die nur konstanten Raum verwendet.
Meine Frage ist - ist es eine Möglichkeit, einen Iterator über einen binären Suchbaum mit den folgenden Eigenschaften zu entwerfen?
- Die Elemente werden in aufsteigender Reihenfolge besucht (dh eine Inorder Traversal)
next()undhasNext()Abfragen ausgeführt in O (1) Zeit.- Speichernutzung ist O (1)
Um es einfacher zu machen, dann ist es in Ordnung, wenn Sie davon ausgehen, dass die Baumstruktur nicht ihre Form verändern während der Iteration (dh keine Insertionen, Deletionen oder Drehungen), aber es wäre wirklich cool, wenn es eine Lösung, die dies in der Tat umgehen konnte.













