Άλλαξε τη ρίζα ενός δέντρου σε έναν επιλεγμένο κόμβο.
Ένα δέντρο είναι ένας ειδικός τύπος γράφου, όπου όλοι οι κόμβοι είναι συνδεδεμένοι αλλά δεν υπάρχουν κύκλοι. Αυτό σημαίνει ότι υπάρχει ακριβώς ένα μονοπάτι για να πας από έναν κόμβο σε έναν άλλο, για οποιοδήποτε ζεύγος κόμβων.
Αυτή η άσκηση έχει να κάνει με τον επαναπροσανατολισμό ενός δέντρου, ώστε να δεις τα πράγματα από μια διαφορετική οπτική γωνία. Για παράδειγμα, τα οικογενειακά δέντρα παρουσιάζονται συνήθως από την οπτική του προγόνου:
+------0------+
| | |
+-1-+ +-2-+ +-3-+
| | | | | |
4 5 6 7 8 9
Όμως ένα δέντρο δεν έχει κάποια εγγενή κατεύθυνση. Οι ίδιες πληροφορίες μπορούν να παρουσιαστούν από την οπτική γωνία οποιουδήποτε άλλου κόμβου του δέντρου, τραβώντας τον κόμβο προς τα πάνω, στη ρίζα, και σύροντας μαζί του και τις σχέσεις του. Έτσι, το ίδιο δέντρο από την οπτική του 6 θα έμοιαζε κάπως έτσι:
6
|
+-----2-----+
| |
7 +-----0-----+
| |
+-1-+ +-3-+
| | | |
4 5 8 9
Αυτό μας επιτρέπει να περιγράφουμε πιο απλά τα μονοπάτια ανάμεσα σε δύο κόμβους. Για παράδειγμα, το μονοπάτι από το 6 στο 9 (που στο πρώτο δέντρο ανεβαίνει στη ρίζα και μετά κατεβαίνει σε ένα διαφορετικό φύλλο) φαίνεται να ακολουθεί το μονοπάτι 6-2-0-3-9.
Αυτή η άσκηση έχει να κάνει με το να πάρεις ένα δέντρο εισόδου και να το επαναπροσανατολίσεις από τη σκοπιά ενός από τους κόμβους του.
Μερικές φορές είναι απαραίτητο να πετάξεις μια εξαίρεση. Όταν το κάνεις αυτό, πρέπει πάντα να συμπεριλαμβάνεις ένα ουσιαστικό μήνυμα σφάλματος που να δείχνει ποια είναι η πηγή του σφάλματος. Αυτό κάνει τον κώδικά σου πιο ευανάγνωστο και βοηθάει σημαντικά στην αποσφαλμάτωση. Σε περιπτώσεις όπου ξέρεις ότι η πηγή του σφάλματος θα είναι κάποιου συγκεκριμένου τύπου, μπορείς να επιλέξεις να πετάξεις έναν από τους ενσωματωμένους τύπους σφαλμάτων, αλλά και πάλι θα πρέπει να συμπεριλάβεις ένα ουσιαστικό μήνυμα.
Αυτή η άσκηση συγκεκριμένα απαιτεί να χρησιμοποιήσεις την εντολή raise για να "πετάξεις" πολλαπλά ValueErrors αν στην κλάση Tree() δοθεί ένα δέντρο που δεν μπορεί να αναπροσανατολιστεί, ή αν δεν βρεθεί ένα μονοπάτι ανάμεσα σε έναν start node και έναν end node.
Τα tests θα περάσουν μόνο αν και πετάξεις τον αναμενόμενο τύπο exception και συμπεριλάβεις και το αναμενόμενο μήνυμα μαζί του.
Έλεγξε προσεκτικά τα tests και τα αναμενόμενα αποτελέσματά τους.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.