Δορυφόρος

Δορυφόρος

Μέτριο

Οδηγίες

Φαντάσου ότι πρέπει να μεταδώσεις ένα δυαδικό δέντρο σε έναν δορυφόρο που πλησιάζει την Άλφα του Κενταύρου και έχεις περιορισμένο εύρος ζώνης. Επειδή το δέντρο δεν έχει επαναλαμβανόμενα στοιχεία, μπορεί να αναπαρασταθεί μονοσήμαντα από τις προθεματικές και ενδοθεματικές διασχίσεις του.

Γράψε το λογισμικό για τον δορυφόρο, ώστε να ανακατασκευάσει το δέντρο από τις διασχίσεις.

Μια προθεματική διάσχιση διαβάζει την τιμή του τρέχοντος κόμβου πριν (εξ ου και το "προ") διαβάσει το αριστερό υποδέντρο με προθεματική σειρά. Στη συνέχεια, διαβάζει το δεξί υποδέντρο με προθεματική σειρά.

Μια ενδοθεματική διάσχιση διαβάζει το αριστερό υποδέντρο με ενδοθεματική σειρά, μετά τον τρέχοντα κόμβο και τέλος το δεξί υποδέντρο με ενδοθεματική σειρά. Δηλαδή με τη σειρά, από τα αριστερά προς τα δεξιά.

Για παράδειγμα, η προθεματική διάσχιση αυτού του δέντρου είναι [a, i, x, f, r]. Η ενδοθεματική διάσχιση αυτού του δέντρου είναι [i, a, f, x, r]

  a
 / \
i   x
   / \
  f   r

Σημείωση: το πρώτο στοιχείο στην προθεματική διάσχιση είναι πάντα η ρίζα.

Μηνύματα εξαίρεσης

Μερικές φορές είναι απαραίτητο να πετάξεις μια εξαίρεση. Όταν το κάνεις αυτό, θα πρέπει πάντα να συμπεριλαμβάνεις ένα κατατοπιστικό μήνυμα σφάλματος που να δείχνει ποια είναι η πηγή του σφάλματος. Αυτό κάνει τον κώδικά σου πιο ευανάγνωστο και βοηθάει σημαντικά στο debugging. Σε περιπτώσεις όπου ξέρεις ότι η πηγή του σφάλματος θα είναι κάποιου συγκεκριμένου τύπου, μπορείς να επιλέξεις να πετάξεις έναν από τους ενσωματωμένους τύπους σφάλματος, αλλά και πάλι θα πρέπει να συμπεριλάβεις ένα κατατοπιστικό μήνυμα.

Αυτή η συγκεκριμένη άσκηση απαιτεί να χρησιμοποιήσεις την εντολή raise για να "πετάξεις" ένα ValueError αν τα ορίσματα preorder και inorder δεν ταιριάζουν ως προς το μήκος, ως προς τα στοιχεία, ή αν τα στοιχεία δεν είναι μοναδικά. Τα tests θα περάσουν μόνο αν κάνεις raise την exception και συμπεριλάβεις ένα μήνυμα μαζί της.

Για να πετάξεις ένα ValueError με μήνυμα, γράψε το μήνυμα ως όρισμα στον τύπο exception:

# if preorder and inorder are not the same length
raise ValueError("traversals must have the same length")

# if preorder and inorder do not share the same elements
raise ValueError("traversals must have the same elements")
    
# if element repeat (are not unique)    
raise ValueError("traversals must contain unique items")
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Python Exercism

Έτοιμος να ξεκινήσεις την άσκηση Δορυφόρος;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.