Vuelve a enraizar un árbol en un nodo seleccionado.
Un árbol es un tipo especial de grafo en el que todos los nodos están conectados, pero no hay ciclos. Esto significa que, para cualquier par de nodos, existe exactamente un camino para ir de un nodo a otro.
Este ejercicio consiste en reorientar un árbol para ver las cosas desde otro punto de vista. Por ejemplo, los árboles genealógicos suelen presentarse desde la perspectiva del antepasado:
+------0------+
| | |
+-1-+ +-2-+ +-3-+
| | | | | |
4 5 6 7 8 9
Pero un árbol no tiene una dirección inherente. La misma información puede presentarse desde la perspectiva de cualquier otro nodo del árbol, subiéndolo hasta la raíz y arrastrando con él sus relaciones. Así, el mismo árbol desde la perspectiva del 6 se vería así:
6
|
+-----2-----+
| |
7 +-----0-----+
| |
+-1-+ +-3-+
| | | |
4 5 8 9
Esto nos permite describir de forma más sencilla los caminos entre dos nodos. Por ejemplo, el camino de 6 a 9 (que en el primer árbol sube hasta la raíz y luego baja a un nodo hoja distinto) se puede ver que sigue el camino 6-2-0-3-9.
Este ejercicio consiste en tomar un árbol de entrada y reorientarlo desde el punto de vista de uno de sus nodos.
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 mucho a la hora de depurar. En situaciones en las 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» varios ValueErrors si se pasa a la clase Tree() un árbol que no se puede reorientar, o si no se encuentra un camino entre un start node y un end node.
Las pruebas solo pasarán si usas raise para lanzar el tipo de exception esperado e incluyes además el mensaje esperado con él.
Revisa con atención las pruebas y sus resultados esperados.
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.