Você está na página 1de 12

RBOLES DE EXPRESION

Un rbol de expresin sirve para evaluar expresiones del tipo: (a+b)*c/d Para que un rbol represente una expresin se deben tomar en cuenta 2 caractersticas muy importantes: Cualquier hoja est etiquetada slo con un operando. Cualquier nodo interior n est etiquetado por un operador.

Por ejemplo, para representar una expresion el arbol quedaria como sigue: a+(b-c)*d/c
+ /

Otro ejemplo: (a+b)*(c+d) * + +

Al introducir la expresin debemos de tomar en cuenta las siguientes caractersticas:


La raz siempre debe ser un operador Las hojas siempre deben ser operandos Los nodos deben estar etiquetados por operadores Si un operador tiene mayor prioridad que la raiz se coloca como hijo. Si un operador tiene igual o menor prioridad que un nodo se coloca como padre. Un nodo puede contener como hijo otro subarbol que contiene un pequea expresion.

En los rboles de expresin, la sucesin del preorden de etiquetas nos da lo que se conoce como la forma prefijo de una expresin Anlogamente, la sucesin postorden de las etiquetas de un rbol expresin nos da lo que se conoce como la representacin postfijo de una expresin Finalmente, el inorden de una expresin en un rbol de expresin nos da la expresin infijo en s misma, pero sin parntesis

CONSTRUCCION DE UN ARBOL DE EXPRESION

Agoritmo:
Mientras carcter diferente de nulo Leer carcter de la lista Si es parntesis pasar al siguiente carcter Crear un nodo nuevo que contenga ese carcter Si el carcter que tiene nuevo es un: Operando si el rbol esta vaco hacer raz a nuevo si no recorrer el rbol por la derecha hasta llegar a un nodo con hojas si la hoja izquierda, no esta etiquetada colocar operando si no colocarlo en la hoja derecha. Operador si la raz es un operando insertar nuevo en ese nodo, y convertir el operando en el hijo izq. si no si hay un parntesis abierto insertar nuevo en la ultima hoja derecha y colocar operando como hijo izquierdo

si el carcter anterior es parntesis izquierdo si el sig. carcter es parntesis derecho si solo hay un operador en el rbol nuevo se convierte en raz si no se inserta en el ultimo nodo derecho, y el nodo se convierte en hijo izquierdo. Si no se cumple ninguna de las condiciones anteriores si la raz es de igual prioridad o menor prioridad convertir la raz en el hijo izq. de nuevo else si la prioridad del nodo raz es mayor al de nuevo insertar nuevo como hijo derecho y colocar el nodo reemplazado como hijo izquierdo.

EVALUACION DE UN ARBOL DE EXPRESIN


Para que un rbol de expresin sea evaluado cada nodo debe ser declarado como sigue:
# define OPERADOR 0 # define OPERANDO 1 struct nodarbol{ short int tipo; //OPERADOR U OPERANDO// union{ char operador[10]; float val; }info; struct nodarbol *izq; struct nodarbol *der; }; typedef nodarbol *NODEPTR;

Debido a que un nodo puede contener informacin que es un numero (operando) o una cadena de caracteres (operador), la parte de informacin del nodo es un componente de union de la estructura. Para realizar la funcin evala necesitamos de una funcin que denominaremos apply(p), la cual acepta un apuntador a un rbol de expresin que contiene un operador nico y sus operndos numricos, y retorna el resultado de aplicar el operador a sus operndos.
La funcin evalua servir para que reciba un apuntador a un rbol de expresin y sustituye el rbol con un nodo de rbol que contiene el resultado numrico de la evaluacin de la expresin.

Funcin evalua
void evalua(NODEPTR raiz){ float value; NODEPTR aux; evalua(aux->izq); evalua(aux->der); apply(aux);
}

La funcin evala rbol quedara;


float evalarbol(NODEPTR raiz){ evalua(raiz);

return (raiz->val);
free(raiz); }

Você também pode gostar