Imagina que tienes que transmitir un árbol binario a un satélite que se aproxima a Alfa Centauri y que dispones de un ancho de banda limitado. Como el árbol no tiene elementos repetidos, se puede representar de forma única mediante sus recorridos en preorden y en inorden.
Escribe el software del satélite para reconstruir el árbol a partir de los recorridos.
Un recorrido en preorden lee el valor del nodo actual antes (de ahí el «pre») de leer el subárbol izquierdo en preorden. Después se lee el subárbol derecho en preorden.
Un recorrido en inorden lee el subárbol izquierdo en inorden, luego el nodo actual y, por último, el subárbol derecho en inorden. Es decir, en orden de izquierda a derecha.
Por ejemplo, el recorrido en preorden de este árbol es [a, i, x, f, r]. El recorrido en inorden de este árbol es [i, a, f, x, r].
a
/ \
i x
/ \
f r
Nota: el primer elemento del recorrido en preorden es siempre la raíz.
A veces es necesario lanzar una excepción. Cuando lo hagas, deberías incluir siempre un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda enormemente con la depuración. En los casos en los que sepas que el origen del error va a ser de un tipo concreto, puedes optar por lanzar uno de los tipos de error integrados, pero aun así deberías incluir un mensaje significativo.
Este ejercicio en concreto requiere que uses la instrucción raise para «lanzar» un ValueError si los argumentos preorder e inorder no coinciden en longitud, no coinciden en sus elementos, o si los elementos no son únicos. Las pruebas solo pasarán si lanzas la exception e incluyes un mensaje con ella.
Para lanzar un ValueError con un mensaje, escribe el mensaje como argumento del tipo 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")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.