Para resolver este problema, recordad que un árbol binario es o bien un árbol vacío, o bien consiste en una raíz y dos subárboles binarios (izquierdo y derecho). El inorden de un árbol binario es una secuencia vacía si el árbol es vacío, y si no es el inorden del subárbol izquierdo, seguido de la raíz, seguida del inorden del subárbol derecho. La altura de un árbol es la longitud del camino más largo desde la raíz hasta cualquier hoja. Un árbol AVL es un árbol binario que es o bien vacío, o bien es tal que sus dos subárboles son AVL, y la diferencia de altura entre ambos es como mucho 1. Una propiedad importante de los árboles AVL es que su altura es logarítmica con respecto al número de nodos.
Como muestra, estos son los tres árboles (iniciales) de los ejemplos de entrada:
[levelsep=25pt,treesep=12pt]50 [levelsep=25pt,treesep=12pt]10 20 40 [levelsep=25pt,treesep=12pt]60 30 10 20 40 90 20 |
Vosotros debéis implementar eficientemente estas operaciones sobre un árbol AVL:
Entrada
La entrada consiste en diversos casos. Cada caso empieza con el número de nodos n (entre 1 y 217 − 1) de un árbol AVL. Cada una de las n líneas siguientes describe al i-ésimo nodo con tres naturales que indican el valor (entre 1 y 1000) contenido en el nodo, el nodo raíz del subárbol izquierdo, y el nodo raíz del subárbol derecho. Los nodos se numeran del 0 al n−1. Los subárboles vacíos se marcan con −1. La raíz del árbol es siempre el nodo 0. Al final viene un natural p entre n y 4n, seguido de p operaciones.
Salida
Para cada operación de tipo ‘S’, escribid la suma correspondiente. Escribid una línea con 10 guiones al final de cada caso.
Input
1 50 -1 -1 3 I 0 S 1 S 0 3 10 1 2 20 -1 -1 40 -1 -1 7 S 0 S 2 S 3 I 0 S 0 S 2 S 3 7 60 2 3 40 -1 -1 30 -1 5 20 1 6 20 -1 -1 10 -1 -1 90 -1 4 8 S 0 S 1 S 2 S 3 S 4 S 5 S 6 S 7
Output
50 0 ---------- 0 30 70 0 50 70 ---------- 0 30 40 100 140 160 250 270 ----------