Stell dir vor, du musst einen Binärbaum zu einem Satelliten übertragen, der sich Alpha Centauri nähert, und du hast nur eine begrenzte Bandbreite. Da der Baum keine wiederholten Elemente enthält, lässt er sich eindeutig durch seine Preorder- und Inorder-Traversierung darstellen.
Schreibe die Software für den Satelliten, damit er den Baum aus den Traversierungen rekonstruiert.
Eine Preorder-Traversierung liest den Wert des aktuellen Knotens, bevor (daher „pre“) sie den linken Teilbaum in Preorder liest. Danach wird der rechte Teilbaum in Preorder gelesen.
Eine Inorder-Traversierung liest zuerst den linken Teilbaum in Inorder, dann den aktuellen Knoten und schließlich den rechten Teilbaum in Inorder. Also in der Reihenfolge von links nach rechts.
Zum Beispiel ist die Preorder-Traversierung dieses Baums [a, i, x, f, r]. Die Inorder-Traversierung dieses Baums ist [i, a, f, x, r]
a
/ \
i x
/ \
f r
Hinweis: Das erste Element der Preorder-Traversierung ist immer die Wurzel.
Manchmal ist es notwendig, eine Ausnahme auszulösen. Wenn du das tust, solltest du immer eine aussagekräftige Fehlermeldung angeben, die verrät, woher der Fehler stammt. Das macht deinen Code lesbarer und hilft beim Debuggen erheblich weiter. In Situationen, in denen du weißt, dass die Fehlerquelle von einem bestimmten Typ ist, kannst du eine der eingebauten Fehlertypen auslösen, solltest aber trotzdem eine aussagekräftige Meldung angeben.
Diese Übung verlangt, dass du die raise-Anweisung verwendest, um einen ValueError zu „werfen“, wenn die Argumente preorder und inorder in der Länge oder in den Elementen nicht übereinstimmen oder die Elemente nicht eindeutig sind. Die Tests bestehen nur dann, wenn du die exception sowohl raisest als auch eine Meldung dazu angibst.
Um einen ValueError mit einer Meldung auszulösen, gib die Meldung als Argument an den Typ exception an:
# 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")
Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.