Έχω κωδικοποίησης μια δέσμη των διαφορετικών εφαρμογών δυαδικό δέντρο αναζήτησης πρόσφατα (AVL, άτεχνος, treap) και είμαι περίεργος αν υπάρχει μια ιδιαίτερα «καλή» τρόπος για να γράψει ένα iterator να διασχίσει αυτές τις δομές. Η λύση που έχω χρησιμοποιήσει αυτή τη στιγμή είναι να έχουμε σε κάθε κόμβο τους δείκτες κατάστημα BST για τα επόμενα και τα προηγούμενα στοιχεία στο δέντρο, το οποίο μειώνει την επανάληψη σε ένα πρότυπο που συνδέονται λίστα επανάληψη. Ωστόσο, δεν είμαι πραγματικά ικανοποιημένος με την απάντηση αυτή. Αυξάνει το χώρο χρήσης του κάθε κόμβου με δύο δείκτες (επόμενο και προηγούμενο), και κατά κάποιο τρόπο είναι απλά εξαπάτηση.
Ξέρω έναν τρόπο οικοδόμησης μιας δυαδικής αναζήτησης δέντρο iterator που χρησιμοποιεί O (h) βοηθητικός χώρος αποθήκευσης (όπου h είναι το ύψος του δέντρου), χρησιμοποιώντας μια στοίβα για να παρακολουθείτε τα σύνορα κόμβων για να εξερευνήσετε αργότερα, αλλά εγώ ve αντιστάθηκαν κωδικοποίησης αυτό επάνω, λόγω της χρήσης της μνήμης. Ήλπιζα ότι υπάρχει κάποιος τρόπος για να οικοδομήσουμε ένα iterator που χρησιμοποιεί μόνο σταθερό χώρο.
Το ερώτημά μου είναι το εξής - είναι ένας τρόπος για να σχεδιάσουμε ένα iterator πάνω από ένα δυαδικό δέντρο αναζήτησης με τις ακόλουθες ιδιότητες εκεί;
- Τα στοιχεία επισκέφθηκε με αύξουσα σειρά (δηλαδή inorder διάσχισης)
next()καιhasNext()ερωτήματα τρέχει σε O (1) ώρα.- χρήση μνήμης είναι Ο (1)
Για να καταστεί ευκολότερη, είναι μια χαρά, αν υποθέσουμε ότι η δομή του δέντρου δεν αλλάζει σχήμα κατά τη διάρκεια της επανάληψης (δηλαδή χωρίς παρεμβολές, διαγραφές, ή περιστροφές), αλλά θα ήταν πολύ καλό αν υπήρχε μια λύση που θα μπορούσε πραγματικά να χειριστεί αυτό.













