Satélite

Satélite

Intermedia

Instrucciones

Imagina que necesitas transmitir un árbol binario a un satélite que se acerca a Alpha Centauri y tienes 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 finalmente 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 siempre es la raíz.

Mensajes de excepción

A veces es necesario lanzar una excepción. Cuando lo hagas, siempre debes incluir 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 muchísimo a la hora de depurar. En los casos en los que sabes 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í debes incluir un mensaje significativo.

Este ejercicio en particular requiere que uses la sentencia raise para «lanzar» un ValueError si los argumentos preorder e inorder no coinciden en longitud, no coinciden en sus elementos, o los elementos no son únicos. Las pruebas solo pasarán si lanzas la exception con raise y además 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")
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Python Exercism

¿Todo listo para empezar Satélite?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.