Вы находитесь на странице: 1из 46

Algoritmos y Estructuras de Datos

Cursada 2011
Prof. Catalina Mostaccio Prof. Alejandra Schiavoni
Facultad de Informtica - UNLP

rboles Binarios

Algoritmos y Estructuras de Datos

Agenda
Definicin Descripcin y terminologa Representaciones Recorridos Tiempo de ejecucin de los recorridos Aplicacin: Arboles de expresin
Algoritmos y Estructuras de Datos 3

rbol Binario: Definicin


Un rbol binario es una coleccin de nodos, tal que:
puede estar vaca puede estar formada por un nodo distinguido R, llamado raz y dos sub-rboles T1 y T2, donde la raz de cada subrbol Ti est conectado a R por medio de una arista

Algoritmos y Estructuras de Datos

Descripcin y terminologa
Cada nodo puede tener a lo sumo dos nodos hijos. Cuando un nodo no tiene ningn hijo se denomina hoja. Los nodos que tienen el mismo nodo padre se denominan hermanos.
Algoritmos y Estructuras de Datos 5

Descripcin y terminologa
Conceptos a usar:
Camino: desde n1 hasta nk, es una secuencia de nodos n1, n2, .,nk tal que ni es el padre de ni+1, para 1 i < k. La longitud del camino es el nmero de aristas, es decir k-1. Existe un camino de longitud cero desde cada nodo a s mismo. Existe un nico camino desde la raz a cada nodo. Profundidad: de ni es la longitud del nico camino desde la raz hasta ni. La raz tiene profundidad cero.

Algoritmos y Estructuras de Datos 6

Descripcin y terminologa
Grado de ni es el nmero de hijos del nodo ni . Altura de ni es la longitud del camino ms largo desde ni hasta una hoja. Las hojas tienen altura cero. La altura de un rbol es la altura del nodo raz. Ancestro/Descendiente: si existe un camino desde n1 a n2, se dice que n1 es ancestro de n2 y n2 es descendiente de n1.

Algoritmos y Estructuras de Datos

Descripcin y terminologa

rbol binario lleno: Dado un rbol binario T y altura h, diremos que T es lleno si cada nodo interno tiene grado 2 y todas las hojas estn en el mismo nivel (h). Es decir, recursivamente, T es lleno si : 1.- T es un nodo simple ( rbol binario lleno de altura 0), o 2.- T es de altura h y sus sub-rboles son llenos de altura h-1.
Algoritmos y Estructuras de Datos 8

Descripcin y terminologa
rbol binario completo: Dado un rbol binario T y altura h, diremos que T es completo si es lleno de altura h-1 y el nivel h se completa de izquierda a derecha. Cantidad de nodos en un rbol binario lleno: Sea T un rbol binario lleno de altura h, la cantidad de nodos N es (2 h+1 1) Cantidad de nodos en un rbol binario completo: Sea T un rbol binario completo de altura h, la cantidad de nodos N vara entre (2 h ) y (2 h+1 1)

Algoritmos y Estructuras de Datos 9

Representacin Hijo Izquierdo - Hijo Derecho


Cada nodo tiene:

Informacin propia del nodo Referencia a su hijo izquierdo Referencia a su hijo derecho

Puede implementarse a travs de:


Arreglos Punteros
Algoritmos y Estructuras de Datos 10

Representacin
Hijo Izquierdo - Hijo Derecho
A
A

B
B C

C D E

Algoritmos y Estructuras de Datos

11

Recorridos
Preorden

Se procesa primero la raz y luego sus hijos, izquierdo y derecho.

Inorden

Se procesa el hijo izquierdo, luego la raz y ltimo el hijo derecho

Postorden

Se procesan primero los hijos, izquierdo y derecho, y luego la raz

Por niveles

Se procesan los nodos teniendo en cuenta sus niveles, primero la raz, luego los hijos, los hijos de stos, etc.

Algoritmos y Estructuras de Datos

12

Recorrido: Recorrido: Preorden


public void preorden() { imprimir (this.getRaiz().getDato()); if(!this.getHijoIzquierdo().esVacio()){ this.getHijoIzquierdo.preorden(); } if(!this.getHijoDerecho().esVacio()){ this.getHijoDerecho.preorden(); } }

Algoritmos y Estructuras de Datos

13

Recorrido Preorden: Tiempo de Preorden: Ejecucin


Considerando un rbol binario lleno y altura h

c T(n) = c + 2 T( (n 1) / 2 ) T(n) es O(n)


Algoritmos y Estructuras de Datos

n=1 n >1

14

Recorrido Preorden: Tiempo de Preorden: Ejecucin


Otra forma: expresando en funcin de la altura

c T(h) = c + 2 T( h 1 ) T(n) es O(n)


Algoritmos y Estructuras de Datos

h=0 h >0

15

Recorrido: Recorrido: Por niveles


public void porNiveles() { Cola q = new Cola(); ArbolBinario arbol; q.encolar(this); while (!q.esVacia()) { arbol = q.desencolar(); imprimir arbol.getRaiz().getDato(); if (!arbol.getHijoIzquierdo().esVacio()){ q.encolar(arbol.getHijoIzquierdo()); if (!arbol.getHijoDerecho().esVacio()){ q.encolar(arbol.getHijoDerecho()); } }
Algoritmos y Estructuras de Datos 16

rbol de Expresin
Es un rbol binario asociado a una expresin aritmtica
Nodos internos representan operadores Nodos externos operandos (hojas) representan

Algoritmos y Estructuras de Datos

17

rbol de Expresin
Ejemplo: * e + a b c d
18

/ + f

Algoritmos y Estructuras de Datos

rbol de Expresin
Recorriendo el rbol, obtenemos: Inorden: (((a + b) * (c d)) / (e + f)) Preorden: /*+ab-cd+ef Postorden: ab+cd-*ef+/

Algoritmos y Estructuras de Datos

19

Construccin de un rbol de expresin


A partir de una:

Expresin postfija Expresin prefija Expresin infija


2 3

+ * 4 5

Algoritmos y Estructuras de Datos

20

Construccin de un rbol de expresin a partir de una expresin postfija


Algoritmo: tomar un carcter de la expresin mientras ( existe carcter ) hacer si es un operando creo un nodo y lo apilo. si es un operador (lo tomo como la raz de los dos ltimos nodos creados) - creo un nodo R, - desapilo y lo pongo como hijo derecho de R - desapilo y lo pongo como hijo izquierdo de R - apilo R. tomo otro carcter fin

Algoritmos y Estructuras de Datos

21

Construccin de un rbol de expresin a partir de una expresin prefija


Algoritmo: ArbolExpresin (A: ArbolBin, exp: string ) si exp nulo si es un operador nada. - creo un nodo raz R - ArbolExpresin (subArbIzq de R, exp (sin 1 carcter) ) - ArbolExpresin ( subArbDer de R, exp (sin 1 carcter) ) creo un nodo (hoja)

si es un operando

Algoritmos y Estructuras de Datos

22

Construccin de un rbol de expresin a partir de una expresin infija


Expresin infija Se usa una pila y se tiene en cuenta la precedencia de los operadores Expresin postfija Se usa la estrategia anterior rbol de Expresin

2+5*3+1

253*+1+

Algoritmos y Estructuras de Datos

23

-Convertir una exp. infija en rbol de expresin : se debe convertir la exp. infija en postfija y a partir de sta, construir el rbol de expresin.
Estrategia del Algoritmo para convertir exp. infija en postfija : a) si es un operando se coloca en la salida. b) si es un operador se maneja una pila segn la prioridad de este operador en relacin al operador de la pila operador con >= prioridad se apila operador con < prioridad se desapila elemento colocndolo en la salida, hasta encontrar uno de menor prioridad (si se encuentra de = prioridad tambin se desapila), luego se apila el operador. c) cuando se llega al final de la expresin, se desapilan todos los elementos llevndolos a la salida, hasta que la pila quede vaca.
Algoritmos y Estructuras de Datos 24

- Consideraciones tenidas en cuenta en el Algoritmo:

Prioridad de los operadores de menor a mayor: +y-,*y/ Los ( siempre se apilan como si tuvieran la mayor prioridad y se desapilan slo cuando aparece un ) .

Algoritmos y Estructuras de Datos

25

Algoritmo: tomar un carcter mientras ( existe carcter ) hacer si es un operando se coloca en la salida. si es un operador - ( se apila operador - ) se desapila elemento y se lleva a la salida hasta encontrar (, que se desapila pero no va a la salida. - + , * , - , / Si el operador es de mayor prioridad que el tope se apila si no se desapila elemento y se lleva a la salida hasta encontrar operador con menor y luego se apila el operador. (segn b) de la Estrategia) tomo otro carcter fin se desapilan los elementos y se llevan a la salida hasta que se vace la pila.
Algoritmos y Estructuras de Datos 26

Ejercitacin
rbol binario de expresin
Ejercicio 1. Dada la siguiente expresin postfija : I J K + + A B * C - * , dibuje su correspondiente rbol binario de expresin Convierta la expresin ((a + b) + c * (d + e) + f ) * (g + h) en expresin prefija Ejercicio 2. Dada la siguiente expresin prefija : * + I + J K - C * A B , dibuje su correspondiente rbol binario de expresin Convierta la expresin ((a + b) + c * (d + e) + f ) * (g + h) en expresin postfija
Algoritmos y Estructuras de de Datos Algoritmos y Estructuras Datos 27

rboles Generales

Algoritmos y Estructuras de Datos

28

Agenda
Definicin Descripcin y terminologa Ejemplos Representaciones Recorridos Tiempo de ejecucin de los recorridos
Algoritmos y Estructuras de Datos 29

Definicin
Un rbol es una coleccin de nodos, tal que:
puede estar vaca. (rbol vaco) puede estar formada por un nodo distinguido R, llamado raz y un conjunto de rboles T1, T2, .Tk, k0 (subrboles), donde la raz de cada subrbol Ti est conectado a R por medio de una arista

Algoritmos y Estructuras de Datos

30

Descripcin y terminologa

Grado del rbol es el grado del nodo con mayor grado. rbol lleno: Dado un rbol T de grado k y altura h, diremos que T es lleno si cada nodo interno tiene grado k y todas las hojas estn en el mismo nivel (h). Es decir, recursivamente, T es lleno si : 1.- T es un nodo simple ( rbol lleno de altura 0), o 2.- T es de altura h y todos sus sub-rboles son llenos de altura h-1.
Algoritmos y Estructuras de Datos 31

Descripcin y terminologa

rbol completo: Dado un rbol T de grado k y altura h, diremos que T es completo si es lleno de altura h-1 y el nivel h se completa de izquierda a derecha. Cantidad de nodos en un rbol lleno: Sea T un rbol lleno de grado k y altura h, la cantidad de nodos N es (k h+1 1) / (k-1)

Algoritmos y Estructuras de Datos

32

Descripcin y terminologa

Cantidad de nodos en un rbol completo: Sea T un rbol completo de grado k y altura h, la cantidad de nodos N vara entre (k h +k -2) / (k-1) y (k h+1 1) / (k-1)

Algoritmos y Estructuras de Datos

33

Ejemplos
Organigrama de una empresa rboles genealgicos Taxonoma que clasifica organismos Organizacin de un libro en captulos y secciones Sistemas de archivos
Algoritmos y Estructuras de Datos 34

Ejemplo: Sistema de archivos


/usr doc bin lib etc tmp users

cp grep sort mail motd passwd

Algoritmos y Estructuras de Datos

35

Representaciones
Lista de hijos

Cada nodo tiene:


Informacin propia del nodo Una lista de todos sus hijos

Hijo ms izquierdo y hermano derecho

Cada nodo tiene:


Informacin propia del nodo Referencia al hijo ms izquierdo Referencia al hermano derecho
Algoritmos y Estructuras de Datos 36

Representacin: Lista de hijos


La lista de hijos, puede estar implementada a travs de:

Arreglos

Desventaja: espacio ocupado

Listas dinmicas

Mayor flexibilidad en el uso

Algoritmos y Estructuras de Datos

37

Representacin: Lista de hijos


A B C D E

F G H

Algoritmos y Estructuras de Datos

38

Representacin: Hijo ms izquierdo y hermano derecho


A B F C D E

Algoritmos y Estructuras de Datos

39

Recorridos
Preorden

Se procesa primero la raz y luego los hijos

Inorden

Se procesa el primer hijo, luego la raz y por ltimo los restantes hijos

Postorden

Se procesan primero los hijos y luego la raz

Por niveles

Se procesan los nodos teniendo en cuenta sus niveles, primero la raz, luego los hijos, los hijos de stos, etc.

Algoritmos y Estructuras de Datos

40

Recorrido: Recorrido: Preorden


/usr doc bin lib etc tmp users

cp grep sort mail motd passwd

Algoritmos y Estructuras de Datos

41

Recorrido: Recorrido: Por niveles


/usr doc bin lib etc tmp users

cp grep sort mail motd passwd

Algoritmos y Estructuras de Datos

42

Recorrido: Recorrido: Preorden


public void preorden() { imprimir (this.getRaiz().getDato()); Lista hijos; hijos = this.getHijos; hijos.comenzar() while (!hijos.fin()) { hijos.actual().preOrden(); hijos.siguiente(); } }

Algoritmos y Estructuras de Datos

43

Recorrido Preorden: Tiempo de Preorden: Ejecucin


Considerando un rbol lleno de grado k y altura h
c T(n) = c + k T( (n 1) / k ) T(n) es O(n)
Algoritmos y Estructuras de Datos 44

n=1 n >1

Recorrido Preorden: Tiempo de Preorden: Ejecucin


Otra forma: expresando en funcin de la altura c T(h) = c + k T( h 1 ) T(n) es O(n)
Algoritmos y Estructuras de Datos 45

h=0 h >0

Recorrido: Por niveles


porNiveles() { Lista hijos; ArbolGeneral arbol; Cola cola = new Cola(); cola.encolar(this); while (!cola.esVacia()) { arbol = cola.desencolar(); imprimir (this.getRaiz().getDato()); hijos = this.getListaHijos(); hijos.comenzar(); while (!hijos.fin()) { cola.encolar(hijos.actual()); hijos.siguiente(); } } }
Algoritmos y Estructuras de Datos 46

Вам также может понравиться