Estructura de Datos Estructura de Datos n4 n2 n1 n5 n6 n3 n7 * + + a b a c rbol de expresiones con etiquetas Expresiones con rboles Expresiones con rboles Expresiones con rboles Expresiones con rboles En la lmina anterior n1,n2, n3, ,n7 son los nombres de En la lmina anterior n1,n2, n3, ,n7 son los nombres de los nodos los nodos Las reglas para representar una expresin mediante un Las reglas para representar una expresin mediante un rbol etiquetado son estas: rbol etiquetado son estas: ! ! 1. Cada hoja est etiquetada con un operando y slo 1. Cada hoja est etiquetada con un operando y slo consta de ese operando. Por ejemplo el nodo n4 consta de ese operando. Por ejemplo el nodo n4 representa la expresin a. representa la expresin a. ! ! 2. Cada nodo interior n est etiquetado con un operador. 2. Cada nodo interior n est etiquetado con un operador. Supngase que n est etiquetado con el operador binario Supngase que n est etiquetado con el operador binario x, como +o *, y que el hijo izquierdo de n representa la x, como +o *, y que el hijo izquierdo de n representa la expresin E1, y el hijo derecho la expresin E2. Entonces n expresin E1, y el hijo derecho la expresin E2. Entonces n representa la expresin (E1) representa la expresin (E1)x(E2 x(E2). Los parntesis se ). Los parntesis se pueden quitar si no son necesarios. pueden quitar si no son necesarios. ! ! Por ejemplo, el nodo n2 tiene el operador +como etiqueta, Por ejemplo, el nodo n2 tiene el operador +como etiqueta, y sus hijos izquierdo y derecho representan las y sus hijos izquierdo y derecho representan las expresiones a y b, respectivamente. Por tanto, n2 expresiones a y b, respectivamente. Por tanto, n2 representa (a)+(b), o ms simple, representa (a)+(b), o ms simple, a+b a+b. El nodo n1 . El nodo n1 representa ( representa (a+b a+b)*( )*(a+c a+c), puesto que * es la etiqueta de n1, y ), puesto que * es la etiqueta de n1, y a+b a+b y y a+c a+c son las correspondientes expresiones son las correspondientes expresiones representadas por n2 y n3. representadas por n2 y n3. Expresiones con rboles Expresiones con rboles B sen Y + + q A Z C X * q(A +B), sen ( C ), X * ( Y +Z ) Expresiones con rboles Expresiones con rboles OTRO EJ EMPLO: ! ! En la anterior figura se mostr una expresin y su En la anterior figura se mostr una expresin y su representacin de rbol. representacin de rbol. ! ! Un recorrido general del rbol en orden previo ( Un recorrido general del rbol en orden previo (preorden preorden) ) produce la cadena produce la cadena q+ABsenC*X+YZ q+ABsenC*X+YZ. sta es la versin . sta es la versin prefija de la expresin. prefija de la expresin. ! ! El recorrido general de orden produce la cadena El recorrido general de orden produce la cadena AB+CsenXYZ+*q AB+CsenXYZ+*q, la cual es la versin , la cual es la versin posfija posfija de la de la expresin. expresin. Expresiones con rboles Expresiones con rboles 2 B * A D * C + + E Orden Previo: +* A B +* C D E En Orden: A * B +C * D +E Orden Posterior: A B * C D * E ++ Expresiones con rboles Expresiones con rboles E * C D + * A + B Orden Previo: +* A B +* C D E En orden: A B * C D * E ++ Orden Posterior: B A D C E * +* + Expresiones con rboles Expresiones con rboles ! ! En este ejemplo se pretende evaluar una expresin cuyos En este ejemplo se pretende evaluar una expresin cuyos operandos son todos constantes. Primero declararemos al nodo operandos son todos constantes. Primero declararemos al nodo rbol. rbol. #define #define OPERADOR 0 OPERADOR 0 #define #define OPERANDO 1 OPERANDO 1 struct struct nodoarbol nodoarbol{ { short short int int utype utype; /*operador u operando*/ ; /*operador u operando*/ union union{ { char char opera[10]; opera[10]; float float val val; ; } } info info; ; struct struct nodoarbol nodoarbol *hijo; *hijo; struct struct nodoarbol nodoarbol * *sig sig; ; }; }; typedef typedef nodoarbol nodoarbol *NODOPTR; *NODOPTR; Expresiones con rboles Expresiones con rboles ! ! Suponiendo que contamos con una funcin llamada Suponiendo que contamos con una funcin llamada apply(p apply(p), la ), la cual acepta un apuntador a un rbol de expresiones que contiene cual acepta un apuntador a un rbol de expresiones que contiene un operador nico y sus operandos numricos, y retorna el un operador nico y sus operandos numricos, y retorna el resultado de aplicar el operador a sus operandos. resultado de aplicar el operador a sus operandos. ! ! Ahora bien, se presenta un procedimiento recursivo reemplaza que Ahora bien, se presenta un procedimiento recursivo reemplaza que acepta un apuntador a un rbol de expresin y sustituye el rbol acepta un apuntador a un rbol de expresin y sustituye el rbol con un nodo de rbol que contiene el resultado numrico de la con un nodo de rbol que contiene el resultado numrico de la evaluacin de la expresin evaluacin de la expresin void void reemplaza(NODOPTR reemplaza(NODOPTR p) p) { { float float valor; valor; NODEPTR q, r; NODEPTR q, r; Expresiones con rboles Expresiones con rboles if(p if(p- -> >utype==OPERADOR utype==OPERADOR){ //el rbol tiene un operador ){ //el rbol tiene un operador q = p q = p- ->hijo; >hijo; //como su //como su raiz raiz while(q while(q! !=NULL =NULL) ) reemplaza(q reemplaza(q); //reemplaza ); //reemplaza q = q q = q- -> >sig sig; ; } //fin de } //fin de while while //aplicar el operador en la raz a los //aplicar el operador en la raz a los //operandos en los subrboles //operandos en los subrboles valor=apply(p valor=apply(p); ); //sustituir el operador por resultado //sustituir el operador por resultado p p- -> >utype=OPERANDO utype=OPERANDO; ; p p- -> >val=valor val=valor; ; //liberar todos los subrboles //liberar todos los subrboles q = p q = p- ->hijo; >hijo; p p- ->hijo = NULL; >hijo = NULL; while(q while(q! !=NULL =NULL){ ){ r = q; r = q; q = q q = q- -> >sig sig; ; free(r free(r); ); } //fin de } //fin de while while } //fin de } //fin de if if } //fin de reemplaza } //fin de reemplaza ! ! La funcin La funcin evalua_arbol evalua_arbol se escribe de modo siguiente: se escribe de modo siguiente: float float evalua_arbol(NODOPTR evalua_arbol(NODOPTR p) p) { { NODOPTR q; NODOPTR q; reemplaza(p reemplaza(p); ); return(p return(p- -> >val val) ) free(p free(p); ); } } Expresiones con rboles Expresiones con rboles 3 bibliografia bibliografia ! ! Estructura de Datos y Algoritmos Estructura de Datos y Algoritmos Alfred Alfred V. V. Aho Aho, , J hon J hon E. E. Hopcroft Hopcroft, , J effrey J effrey D.Ullman D.Ullman ! ! Estructura de Datos en C y C++ Estructura de Datos en C y C++ Tenenbaum Tenenbaum, , Langsam Langsam, , Augenstein Augenstein