Transformación del árbol de expresiones usando enum y pattern matching
Rust
Hard
enums
Tarea «Transformación del árbol de expresiones usando enum y pattern matching»
Se da una expresión aritmética representada como un árbol binario. Cada nodo del árbol es un número (hoja) o una operación (suma, resta, multiplicación, división) con dos descendientes. Es necesario implementar una función que reciba dicho árbol y devuelva un nuevo árbol simplificado según las siguientes reglas: si un nodo es una operación y ambos descendientes son números, calcular el resultado y reemplazar el nodo por un número; si uno de los descendientes es el número 0 y la operación es multiplicación, reemplazar el nodo por 0; si uno de los descendientes es el número 0 y la operación es suma, reemplazar el nodo por el otro descendiente; si la operación es división y el divisor es el número 1, reemplazar el nodo por el dividendo; si la operación es resta y ambos descendientes son iguales, reemplazar el nodo por el número 0. Aplicar recursivamente hasta que sea posible. Se garantiza que todas las operaciones son enteras, la división es entera con redondeo hacia abajo.
Formato de entrada
Entero n (1 ≤ n ≤ 1000). Luego n líneas: para número: "num x"; para operación: "op op_symbol left right".
Formato de salida
n líneas: para cada nodo en el orden original: "num value" o "op symbol left right".
Ejemplos
Ejemplo 1
ENTRADA
3
num 5
num 3
op + 0 1
SALIDA
num 5
num 3
op + 0 1
Ejemplo 2
ENTRADA
cat dog elephant bird
SALIDA
cat dog bird elephant
Ejemplo 3
ENTRADA
5
num 0
num 7
op * 0 1
num 2
op + 2 3
SALIDA
num 0
num 7
op * 0 1
num 2
op + 2 3
Ejemplo 4
ENTRADA
a ab abc abcd
SALIDA
a ab abc abcd
main.rs