Ένας τρόπος για να σκεφτεί για αυτό το πρόβλημα είναι να χρησιμοποιήσει το γεγονός ότι η inorder πόδια του δέντρου θα παράγει όλα τα στοιχεία σε ταξινομημένη σειρά. Εάν μπορείτε να εντοπίσετε αποκλίσεις από την ταξινομημένη σειρά κατά τη διάρκεια αυτής της διαδρομής, μπορείτε να προσπαθήσετε να εντοπίσετε τα δύο στοιχεία που είναι σε λάθος μέρος.
Ας δούμε πώς να το κάνουμε αυτό για έναν απλό ταξινομημένο πίνακα πρώτα, τότε θα χρησιμοποιήσει ο αλγόριθμος μας να οικοδομήσουμε κάτι που λειτουργεί στα δέντρα. Διαισθητικά, αν ξεκινήσετε με ένα ταξινομημένο πίνακα και στη συνέχεια να ανταλλάξουν δύο (μη-ίσα!) Στοιχεία, θα καταλήξουμε με κάποιο αριθμό των στοιχείων του πίνακα είναι εκτός τόπου. Για παράδειγμα, δίνεται η συστοιχία
1 2 3 4 5
Αν αλλάζετε 2 και 4, μπορούμε να καταλήξουμε σε αυτό το πίνακα:
1 4 3 2 5
Πώς θα διαπιστώσουμε ότι 2 και 4 μετατράπηκε εδώ; Λοιπόν, από τις 4 είναι η μεγαλύτερη από τις δύο στοιχεία και αντάλλαξαν προς τα κάτω, θα πρέπει να είναι μεγαλύτερη από ό, τι τα δύο από τα στοιχεία γύρω από αυτό. Παρομοίως, επειδή 2 ανταλλαχθούν πάνω, θα πρέπει να είναι μικρότερο από τα δύο από τα στοιχεία γύρω από αυτό. Από αυτό, θα μπορούσαμε να συμπεράνουμε ότι 2 και 4 αντάλλαξαν.
Ωστόσο, αυτό δεν λειτουργεί πάντα σωστά. Για παράδειγμα, ας υποθέσουμε ότι έχουμε ανταλλάξει 1 και 4:
4 2 3 1 5
Εδώ, τόσο 2 και 1 είναι μικρότερες από τις γειτονικές τους στοιχεία, και οι δύο 4 και 3 είναι μεγαλύτερα από τα δικά τους. Από αυτό μπορούμε να πούμε ότι δύο από τα τέσσερα αυτά με κάποιο τρόπο μετατράπηκε, αλλά δεν είναι σαφές ποια θα πρέπει να εναλλάσσονται. Ωστόσο, αν πάρουμε το μεγαλύτερο και το μικρότερο των τιμών αυτών (1 και 4, αντίστοιχα), καταλήγουμε να πάρει το ζευγάρι που αντάλλαξαν.
Γενικότερα, για να βρείτε τα στοιχεία που αντάλλαξαν με τη σειρά, που θέλετε να βρείτε
- Το μεγαλύτερο τοπικό μέγιστο της συστοιχίας.
- Το μικρότερο τοπικό ελάχιστο στη συστοιχία.
Αυτά τα δύο στοιχεία είναι εκτός τόπου και πρέπει να ανταλλαχθούν.
Τώρα, ας σκεφτούμε για το πώς να εφαρμόσουν αυτό σε δέντρα. Από την inorder πόδια του δέντρου θα παράγει το ταξινομημένη ακολουθία με τα δύο στοιχεία εκτός λειτουργίας, μια επιλογή θα ήταν να περπατήσει το δέντρο, καταγράφοντας την ακολουθία inorder των στοιχείων που έχουμε βρει, στη συνέχεια, χρησιμοποιώντας τον παραπάνω αλγόριθμο. Για παράδειγμα, σκεφτείτε την αρχική BST σας:
20
/ \
15 30
/ \ / \
10 17 25 33
/ | / \ / \ | \
9 16 12 18 22 26 31 34
Αν γραμμικοποίηση αυτό σε μια σειρά, παίρνουμε
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
Παρατηρήστε ότι 16 είναι μεγαλύτερη από περιβάλλοντα στοιχεία της και ότι 12 είναι μικρότερη από της. Αυτό μας λέει αμέσως ότι 12 και 16 αντάλλαξαν.
Ένας απλός αλγόριθμος για την επίλυση αυτού του προβλήματος, ως εκ τούτου, θα ήταν να κάνετε μια βόλτα inorder του δέντρου για να ευθυγραμμιστεί σε μια σειρά σαν vectorή deque, στη συνέχεια, να ανιχνεύσει ότι η ακολουθία για να βρούμε το μεγαλύτερο τοπικό μέγιστο και το μικρότερο τοπικό ελάχιστο. Αυτό θα τρέχει σε O (n) χρόνο, χρησιμοποιώντας O (n) χώρο. Μια πιο περίπλοκη, αλλά περισσότερο χώρο-αποδοτικός αλγόριθμος θα ήταν να διατηρηθεί μόνο κομμάτι των τριών κόμβων σε ένα χρόνο - το τρέχον κόμβο, τον προκάτοχό του, και ο διάδοχός του - το οποίο μειώνει τη χρήση της μνήμης σε O (1).
Η ελπίδα αυτό βοηθά!