Vous êtes sur la page 1sur 3

rboles de Expresion

Los rboles de expresiones representan el cdigo de nivel del lenguaje en forma de datos. Los
datos se almacenan en una estructura con forma de rbol. Cada nodo del rbol de expresin
representa una expresin, por ejemplo, una llamada al mtodo o una operacin binaria, como x
< y.
En la ilustracin siguiente se muestra un ejemplo de una expresin y su representacin en forma
de un rbol de expresin. Las diferentes partes de la expresin tienen un color distinto para
hacerlas coincidir con el nodo correspondiente del rbol de expresin. Tambin se muestran los
diferentes tipos de los nodos del rbol de expresin.
REGLAS PARA LA CONSTRUCCION DE ARBOLES DE EXPRESION
Para contruir el rbol de expresiones que represente nuestra expresin matemtica es necesario
construir primero la misma expresin pero en la notacin polaca correspondiente y a partir de
esta es que se construye el rbol. El algoritmo usado para transformar una expresin infija a
prefija es explicado a continuacin.
Sea A una expresin infija cualquiera, formada por operadores, parntesis (izquierdos y
derechos) y operandos, tambin se usar una pila para los operadores. El procedimiento seguido
es el siguiente:
Se lee un elemento de A, si este es un operador o un parntesis izquierdo, entonces se acta
segn la regla I y si es un operando entonces se enva directamente a la expresin de notacin
polaca. Si el elemento ledo de A es un parntesis derecho, entonces se desapilarn elementos
de la pila de operadores hasta encontrar el correspodiente parntesis izquierdo. Cada elemento
desapilado pasa a formar parte de la notacin polaca, excepto los parntesis. Cuando no queden
elementos en A, entonces se desapilan operadores de la pila, hasta que esta quede vaca.
Regla I:
Existe un orden de prioridad para los operadores, que de menor a mayor es el siguiente: suma
(+) y resta (-), multiplicacin (*) y divisin (/), exponenciacin (^), operadores unarios. El
parntesis izquierdo lo trataremos como un operador (aunque no lo es) cuyo orden de prioridad
es el mayor de todos cuando se quiera apilar y el menor de todos cuando est en la cima de la
pila.
Cuando se intente apilar algn operador se har lo siguiente: si es un operador unario entonces
se apila, si es un operador binario, se comparar su prioridad con el ltimo insertado en la pila
(el de la cima), si su prioridad es mayor, entonces se apilar. Si ocurre lo contrario (su prioridad
es menor o igual) entonces el operador de la cima de la pila se desapilar y pasar a formar
parte de la notacin polaca. Se volver a intentar apilar el operador siguiendo la misma regla,
hasta que se pueda apilar, si la pila queda vaca tambin se apila. El parntesis izquierdo
siempre se apilar y no podr ser desapilado por ningn operador y por tanto no formar parte
de la notacin polaca inversa.
El siguiente ejemplo, ayudar a entender mejor lo dicho anteriomente. Sea la siguiente
expresin infija: 2^sin(y+x)ln(x).
En la siguiente tabla se muestra paso a paso la conversin a notacin postfija. Se usa el color
rojo para sealar los casos en que es necesario desapilar operadores de la pila.
Construccion del rbol binario de expresiones

Una vez obtenida la expresin en notacin postfija, se puede evaluar mediante el uso
nuevamente de una pila. Sin embargo, en nuestro caso se trabaja con una rbol binario de
expresiones, as que lo que se hace es construir el rbol. El algoritmo usado para construir el
rbol no usa como tal la expresin postfija ya conformada, sino que el rbol se va construyendo
usando las mismas reglas con las que se construye la notacin postfija, una pila para los
operadores y otra para los nodos del rbol, ambas no son necesitadas al terminar el rbol. El
algoritmo es el siguiente:

Se siguen las mismas reglas expuestas anteriormente usando la pila de operadores, pero cuando
se encuentra un operando o un operador es desapilado, entonces se crea el nodo
correspondiente y se acta segn la regla II. Al finalizar el algoritmo solo debe quedar un nodo
apilado en la pila de nodos, el que constituye el nodo raz de nuestro rbol de expresiones.
Regla II.
Si el nodo corresponde a un operando, entonces se apila. Si el nodo corresponde a una operador
unario entonces se desapila un nodo de la pila de nodos y es enlazado a la rama izquierda del
nodo correspondiente al operador unario y este ltimo es apilado. Si el nodo corresponde a un
operador binario entonces dos nodos son desapilados de la pila de nodos, el primero es
enlazado a la rama derecha del nodo binario y el segundo a la rama izquierda, nuevamente este
nodo es apilado.
En el siguiente ejemplo se usa la misma expresin infija anterior (2^sin(y+x) ln (x)) para ilustrar
el procedimiento para construir el rbol:
Recorrido en preorden
En este tipo de recorrido se realiza cierta accin (quizs simplemente imprimir por pantalla el
valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subrbol
izquierdo y cuando se haya concluido, el subrbol derecho. Otra forma para entender el
recorrido con este metodo seria seguir el orden: nodo raiz, nodo izquierda, nodo derecha.
En el rbol de la figura el recorrido en preorden sera: 2, 7, 2, 6, 5, 11, 5, 9 y 4.
void preorden(tArbol *a)
{
if (a != NULL) {
tratar(a); //Realiza una operacin en nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho);
}
}

Implementacin en pseudocdigo de forma iterativa:
push(s,NULL); //insertamos en una pila (stack) el valor NULL, para asegurarnos de que est
vaca
push(s,raz); //insertamos el nodo raz
MIENTRAS (s <> NULL) HACER
p = pop(s); //sacamos un elemento de la pila
tratar(p); //realizamos operaciones sobre el nodo p
SI (D(p) <> NULL) //preguntamos si p tiene rbol derecho
ENTONCES push(s,D(p));
FIN-SI
SI (I(p) <> NULL) //preguntamos si p tiene rbol izquierdo
ENTONCES push(s,I(p));
FIN-SI

Vous aimerez peut-être aussi