Imagine que define que un árbol debe mostrarse de la siguiente manera, por ejemplo: "<1#<<2#3>#<4#5>>>"
. Doblar dicho árbol significa reemplazar cada nodo de rama con una operación real suministrada que se realizará en los resultados del doble recursivo realizado en los constituyentes del tipo de datos (aquí, los dos nodos hijos del nodo, que son ellos mismos, cada uno, un árbol), por ejemplo con +
, produciendo (1+((2+3)+(4+5)))
.
Así, para las hojas que sólo debe tomar los valores dentro de ellos, y por ramas, aplicar de forma recursiva el pliegue para cada uno de los dos, y combinar los dos resultados con la función suministrada, aquella con la que el árbol es doblada. (edit:) Al "tomar" valores de hojas, también puede transformarlos, aplicando una función única. Así pues, en general, su plegamiento necesitará dos funciones proporcionadas por el usuario, uno para hojas, y otro para combinar los resultados de plegado de forma recursiva los consituents de ramas.
Su tipo de datos de árbol podría haberse definido de manera diferente, p. con hojas posiblemente vacías, y con nodos internos que también llevan los valores. Entonces tendría que proporcionar un valor predeterminado para ser utilizado en lugar de nodos hoja vacíos, y una operación de combinación de tres vías.
Otra distinción para darse cuenta de que aquí es, lo doblas, y cómo se pliegue. Es decir. podría doblar su árbol en una lineal moda, (1+(2+(3+(4+5))))
, o podría doblar una lista lineal en como un árbol moda. Se trata de cómo se entrelaza la "expresión" resultante. Por supuesto, en la versión clásica de plegable, la estructura de la exsión sigue la de la estructura de datos que se está plegando; pero variations do exist. Tenga en cuenta también que la operación de combinación podría no ser estricta y podría consumir/producir compuesto, así como valores atómicos.
Ahora que la pregunta es lo suficientemente antigua, sería bueno ver la respuesta completa, para aquellos que quieren aprender y no tienen tarea. –