La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Arboles Binarios de expresiones

Presentaciones similares


Presentación del tema: "Arboles Binarios de expresiones"— Transcripción de la presentación:

1 Arboles Binarios de expresiones

2 Estructuras de Datos y Algoritmos
Observemos cómo las expresiones binario y árbol sugieren que los árboles binarios tienen algo en común con las expresiones aritméticas: ¿Por qué? Las expresiones aritméticas están formadas por valores, sobre los que pueden ejecutarse operaciones binarias (suma, resta, multiplicación y división). Cada nodo de un árbol binarios puede tener a lo sumo dos hijos, con lo que podemos representar una expresión binaria simple como un árbol binario de dos niveles. La raiz contiene el operador, y los dos hijos contienen los operandos: = 8 + 6 = 5 - 2 = 3 * 7 = 9 / 3 Estructuras de Datos y Algoritmos

3 Estructuras de Datos y Algoritmos
Cuando escribimos una expresión en notación infija, debemos utilizar paréntesis y un orden de precedencia para resolver su cálculo. Por ejemplo, si tenemos D= A+B*C, sabemos por jerarquía de operadores que primero calcula B*C, y ese resultado lo suma a A. Pero si lo que queremos es multiplicar la suma de A y B, por C, debemos escribir D=(A+B) *C. Si utilizamos un árbol binario, esto no es necesario, porque los niveles determinan la precedencia, así, en nuestro caso será: Estructuras de Datos y Algoritmos

4 Estructuras de Datos y Algoritmos
Veamos en el pizarrón cómo se evalúa cada uno de los siguientes árboles Valor2 / 69 + * 3 8 5 Valor1 + 9 4 * 78 - 27 Estructuras de Datos y Algoritmos

5 Evaluación de una expresión Operando1 OperadorBin Operando2
Desarrollaremos una función para evaluar un árbol binario de una expresión. Sabemos que el valor del árbol completo es igual a: Operando OperadorBin Operando2 Siendo OperadorBin uno de los operadores binarios (+, -, *, /) en el nodo raiz, Operando1 es el valor del subárbol izquierdo, y Operando2 es el valor del subárbol derecho. Y cuál es el valor del subárbol izquierdo? O es un simple valor, o es una expresión que debemos evaluarla, y así seguiremos descubriendo que nuestra función será recursiva. Lo mismo para el subárbol derecho. Estructuras de Datos y Algoritmos

6 Estructuras de Datos y Algoritmos
Función Eval Objetivo: Evaluar la expresión representada por el árbol binario. Tamaño: El árbol completo apuntado por Arbol Caso base: Si el contenido del nodo es un operando, entonces Eval ←el valor del operando Caso general: Si el contenido del nodo es un operador entonces eval ← eval(subarbol izquierdo) OperadorBin eval(subarbol derecho) Estructuras de Datos y Algoritmos

7 Estructuras de Datos y Algoritmos
Esa descripción nos conduce al siguiente algoritmo para la función Eval: Función Eval if info(Arbol) es un operando then Eval← Info(Arbol) else -- es un operador case Info(Arbol) is when '+' => Eval ← Eval(Izquierda(Arbol)) + Eval(Derecha(Arbol)); when '*‘ => Eval ← Eval(Izquierda(Arbol)) * Eval(Derecha(Arbol)); when '-' => Eval ← Eval(Izquierda(Arbol)) - Eval(Derecha(Arbol)); when '/' => Eval ← Eval(Izquierda(Arbol)) / Eval(Derecha(Arbol)); when others =>-- no hacer nada; end case; Estructuras de Datos y Algoritmos

8 Estructuras de Datos y Algoritmos
Una implementación en ADA, para evaluar una expresión almacenada en un árbol binario de expresiones en el que cada nodo contiene un carácter es: function Eval(Arbol:T_Arbol) return Integer is X: Integer; begin if Is_Digit(Arbol.Info) then X:=Character'Pos(Arbol.Info) - 48; else case Arbol.Info is when '+' => X:=Eval(Arbol.Izquierdo)+Eval(Arbol.Derecho); when '*'=> X:=Eval(Arbol.Izquierdo)*Eval(Arbol.Derecho); when '-' => X:=Eval(Arbol.Izquierdo)-Eval(Arbol.Derecho); when '/' => X:=Eval(Arbol.Izquierdo)/Eval(Arbol.Derecho); when others =>null; end case; end if; return X; end; Estructuras de Datos y Algoritmos

9 Estructuras de Datos y Algoritmos
Pero si queremos generalizar el campo info, de manera que pueda almacenar un operando (valor numérico entero o real) o un operador (carácter), podemos representar esa información utilizando un registro con campo variante, de la siguiente manera: type T_Info is (Operador, Operando); type Tipo_Elemento is (Contenido:T_Info) is record Izquierdo, Derecho: T_Arbol; case Contenido is when Operador => Oper:Character; when Operando => Val:Float; -- o Integer, según sea el tipo de los operandos when others => null; end case; end record; Estructuras de Datos y Algoritmos

10 Construcción del Arbol Binario de una expresión
Recordamos que en la aplicación de pilas vimos cómo evaluar una expresión en notación infija . El mismo esquema algorítmico se utiliza para convertir una expresión de infija a prefija. Esto lo destacamos porque vamos a partir de una expresión prefija para la construcción del árbol binario de expresiones. El formato básico de la expresión prefija es: OperadorBin Operando1 Operando2 Por ejemplo, si tenemos * A B , el operador * irá en el nodo raiz, y de los operandos , A irá a la izquierda y B a la derecha. ¿Qué pasa si uno de los operandos es una expresión? Por ejemplo * + A F G. [Equivalente a (A+F) * G ] Otra vez el operador * irá en el nodo raíz, luego el Operador + irá a su izquierda, como raiz de la expresión A+F, por lo que A y F serán sus hijos, y luego G será el hijo derecho del operador *. Para hacer este enlace con * deberemos volver atrás, en orden. Estructuras de Datos y Algoritmos

11 Estructuras de Datos y Algoritmos
El método general que utilizaremos para poner nodos en el árbol es el siguiente: Insertaremos nuevos nodos, cada vez moviéndonos hacia la izquierda hasta que pongamos un operando. Volvemos atrás hasta el último operador insertado Poner el siguiente nodo a su derecha Repetir de la misma forma desde el paso 1, hasta que se ingrese el último operando. Obviamente que necesitaremos una pila para almacenar los punteros a los operadores, y una marca para controlar los movimientos. A ésta la llamaremos sigMovimiento, denotando a izquierda cuando el nodo actual es un operador, y a derecha cuando es un operando Estructuras de Datos y Algoritmos

12 Estructuras de Datos y Algoritmos
procedure Construirarbol(Cadenapref: in out Tipoprefija;Raizarbol : in out Tipoarbol) is Ultimosimbolo : constant Character:=';'; type Movimiento is (Izquierdo,Derecho); Ptrpila:Tipopila; Sigmov:Movimiento; Ultimo,Nuevonodo: Tipoarbol; Simbolo:Character; procedure Obtenersimbolo(Cadenapref: in out Tipoprefija;Simbolo:in out Character) is begin Simbolo:=Cadenapref(1); Delete(Cadenapref,1,1); end; Obtenersimbolo(Cadenapref,Simbolo); Nuevonodo:= new Tiponodo'(Simbolo,null,null); Raizarbol:=Nuevonodo; Sigmov:=Izquierdo; while Simbolo/= Ultimosimbolo loop Ultimo:=Nuevonodo; if Sigmov=Izquierdo then Ultimo.Izquierdo:=Nuevonodo; Insertar(Ptrpila,Ultimo); else Suprimir(Ptrpila,Ultimo); Ultimo.Derecho:=Nuevonodo; end if; case Simbolo is when '*'|'+'|'-'|'/'=> Sigmov:=Izquierdo; when others =>Nuevonodo.Izquierdo:=null; Nuevonodo.Derecho:=null; Sigmov:=Derecho; end case; end loop; end Construirarbol; Estructuras de Datos y Algoritmos

13 Estructuras de Datos y Algoritmos
Seguiremos el algoritmo con una expresión sencilla: * + A – B C D El primer símbolo es el * y con él construimos el nodo raíz. En ese momento, antes del bucle, cuando obtenemos el siguiente símbolo nuestro árbol y todas las variables involucradas quedan así: Antes de la primera iteración del bucle: PtrPila Raiz * NuevoNodo * A – B C D ; sigMovimiento=Izquierdo simbolo Estructuras de Datos y Algoritmos

14 Estructuras de Datos y Algoritmos
Siguiendo la secuencia del bucle: Raiz * UltimoNodo PtrPila UltimoNodo + NuevoNodo * A – B C D ; sigMovimiento=Izquierdo simbolo Estructuras de Datos y Algoritmos

15 Estructuras de Datos y Algoritmos
Sigue el bucle porque simbolo /= ‘;’ Raiz * UltimoNodo0 + UltimoNodo1 UltimoNodo0 PtrPila UltimoNodo1 A NuevoNodo * A – B C D ; sigMovimiento=Derecho simbolo Estructuras de Datos y Algoritmos

16 Estructuras de Datos y Algoritmos
Sigue el bucle porque simbolo /= ‘;’ Raiz * UltimoNodo0 + UltimoNodo0 PtrPila UltimoNodo1 A - NuevoNodo * A – B C D ; sigMovimiento=Izquierdo simbolo Estructuras de Datos y Algoritmos

17 Estructuras de Datos y Algoritmos
Al final de la cuarta iteración del bucle: Raiz * UltimoNodo0 + UltimoNodo2 UltimoNodo0 PtrPila A - UltimoNodo2 B NuevoNodo * A – B C D ; sigMovimiento=Derecho simbolo Estructuras de Datos y Algoritmos

18 Estructuras de Datos y Algoritmos
El siguiente nodo será añadido a la derecha del UltimoNodo2 Raiz * UltimoNodo0 + UltimoNodo0 PtrPila A - UltimoNodo2 B C NuevoNodo * A – B C D ; sigMovimiento=Derecho simbolo Estructuras de Datos y Algoritmos

19 Estructuras de Datos y Algoritmos
El siguiente nodo será añadido a la derecha del UltimoNodo0 Raiz * UltimoNodo0 D + PtrPila NuevoNodo A - B C * A – B C D ; sigMovimiento=Derecho simbolo Estructuras de Datos y Algoritmos

20 Estructuras de Datos y Algoritmos
El siguiente símbolo es el carácter de último símbolo, por lo que se sale del proceso. Veamos un programa en ejecución: Estructuras de Datos y Algoritmos


Descargar ppt "Arboles Binarios de expresiones"

Presentaciones similares


Anuncios Google