26
Árbol Binario de Búsqueda Algorítmica y Programación II Algorítmica y Programación II Nivel lógico ¿Qué es un árbol? Las imágenes representan distintos objetos pero cada uno ilustra un concepto común: un árbol. Un árbol es una estructura de datos en forma jerárquica o de niveles, en cuyos elementos puede existir una relación de uno a muchos (1:n). 2

AlgoritmicaII-Arbol Binario de Busqueda

  • Upload
    giu09

  • View
    215

  • Download
    1

Embed Size (px)

DESCRIPTION

Algoritmica II

Citation preview

Page 1: AlgoritmicaII-Arbol Binario de Busqueda

Árbol Binario de Búsqueda

Algorítmica y Programación II

Alg

orítm

ica

y P

rogr

amac

ión

II

Nivel lógico

¿Qué es un árbol?

Las imágenes representan distintos objetos perocada uno ilustra un concepto común: un árbol.

Un árbol es una estructura de datos en formajerárquica o de niveles, en cuyos elementospuede existir una relación de uno a muchos (1:n).

2

Page 2: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Nodo raíz: primer elemento de un árbol. Notiene ascendiente.

Nodo padre: nodo que tiene por lo menos unhijo.

Hijo: descendiente de un nodo. Nodo hoja: nodo que no tiene descendiente. Nodos hermanos: nodos con un mismo

padre. Rama: relación que conecta un padre con un

hijo.

Terminología básica

3

Alg

orítm

ica

y P

rogr

amac

ión

II

Ancestro: nodo padre de un nodo o padre dealgún nodo ancestro.

Descendiente: hijo de un nodo o hijo de otrodescendiente de ese nodo.

Subárbol: conjunto de descendientes de unnodo por una de las ramas.

Nivel de un nodo: distancia desde la raíz.Esta es el nivel cero.

Grado de un nodo: número de hijos quetiene.

Terminología básica

4

Page 3: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Nodo raíz

Nodos hoja

Subárbol

5

Nivel 0

Nivel 2

Alg

orítm

ica

y P

rogr

amac

ión

II

6

o Hijo izquierdo de nodo raíz: nodo que contiene 3.

o Nodo padre de nodos que contienen 1 y 6: nodo que contiene 3.

o Nodos hoja: nodos que contienen 1, 4, 7 y 13.

o Nodos hermanos: nodos que contienen (1 y 6), (4 y 7), (3 y 10).

o Ancestros de nodo que contiene 14: nodos que contienen 10 y 8.

o Descendientes de nodo que contiene 3: nodos que contienen 1, 6, 4 y 7.

o Subárbol derecho de nodo raíz: tiene como raíz al nodo que contiene 10.

Page 4: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Árbol – Árbol binario

Árbol general: aquel en el que no seconsidera ninguna limitación en el gradomáximo de sus nodos. Los árboles n-ariosson aquellos en los que el grado máximo desus nodos es n, siendo n un número positivo.

Árbol binario: aquel en que cada nodo tienecomo máximo dos hijos.

7

Alg

orítm

ica

y P

rogr

amac

ión

II

Árbol Binario de Búsqueda

Estructura de datos que guarda información norepetida, en el que cada nodo apunta como máximoa dos nodos y además cumple con un ordenamientode modo que para cada elemento del ABB, loselementos menores están a su izquierda (subárbolizquierdo) y los mayores a su derecha (subárbolderecho).

8

Page 5: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II¿Qué operaciones senecesitan?

Crear Insertar Suprimir Vacío Buscar Limpiar

9

Alg

orítm

ica

y P

rogr

amac

ión

II

Especificación del TAD ABB

Función de acceso: la ubicación de cada elementoen el árbol satisface la siguiente regla: el valor de laclave de un elemento es mayor que el valor de laclave de cualquier elemento en su subárbolizquierdo y menor que el valor de la clave decualquier elemento en su subárbol derecho.

Crear(Arbol)Función: Inicializar Arbol al estado vacío.Entrada: Ninguna.Precondiciones: Ninguna.Salida: Arbol.Poscondiciones: Arbol está vacío.

10

Page 6: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Especificación del TAD ABB

Vacio(Arbol)

Función: Indicar si Arbol está vacío.

Entrada: Arbol a ser testeado.

Precondiciones: Arbol existe.

Salida: Vacio (valor booleano).

Poscondiciones: Vacio = (el árbol está vacío).

11

Alg

orítm

ica

y P

rogr

amac

ión

II

Suprimir(Arbol, ValSup)Función: Quitar de Arbol el elemento

especificado.Entrada: Arbol, ValSup.Precondiciones: Arbol existe, ValSup pertenece a

la Arbol.Salida: Arbol (cambiado)Poscondiciones: Arbol = Arbol original sin ValSup.Excepciones: Plantea ArbolVacio si ValSup no

pertenece a Arbol. El árbol no semodifica.

Especificación del TAD ABB

12

Page 7: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Especificación del TAD ABB

Insertar(Arbol, NuevoElemento)

Función: Añadir NuevoElemento a Arbol.

Entrada: Arbol, NuevoElemento.

Precondiciones: Arbol existe.

Salida: Arbol (cambiado).

Poscondiciones: Arbol = Arbol original +NuevoElemento.

13

Alg

orítm

ica

y P

rogr

amac

ión

II

Especificación del TAD ABB

Esta(Arbol,Valor)

Función: Indicar si Valor pertenece a Arbol.

Entrada: Arbol, Valor.

Precondiciones: Arbol existe.

Salida: Esta (valor booleano)

Poscondiciones: Esta = (Valor pertenece a Arbol)

14

Page 8: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Limpiar(Arbol)

Función: Liberar los nodos que pudieranexistir en Arbol.

Entrada: Arbol a vaciar.

Precondiciones: Arbol existe

Salida: Arbol (vacío)

Poscondiciones: Arbol está vacío.

Especificación del TAD ABB

15

Alg

orítm

ica

y P

rogr

amac

ión

II

Especificación del TAD ABB

Buscar(Arbol, clave, infoNodo, encontrado)

Función: Buscar el nodo clave y devolver los datos asociados. Devuelve falso si no pertenece.

Entrada: Arbol y clave.

Precondiciones: Arbol no es vacío

Salida: infoNodo, encontrado

Poscondiciones:infoNodo = datos del nodo quecontiene clave si está en el árbol;en ese caso encontrado esverdadero, en caso contrario esfalso. 16

Page 9: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

TAD ABB

type TipoNodo;type TipoArbol is access TipoNodo;type TipoNodo isrecord

Info: TipoElem;Izq, Der: TipoArbol;

end record;

17

Puntero a la raíz del subárbol derecho

Puntero a la raíz del subárbol izquierdo

Info

TipoNodo

Alg

orítm

ica

y P

rogr

amac

ión

II

18

generictype TipoElem is private;with function "<" (X, Y: TipoElem) return Boolean;with function ">" (X, Y: TipoElem) return Boolean;with procedure Put (X: in TipoElem);package Arbol is

type TipoArbol is private;-- procedure Crear (Raiz: out TipoArbol); -- no es necesario

function Vacio (Raiz: TipoArbol) return Boolean; procedure Insertar (Raiz: in out TipoArbol; Elemento: in TipoElem);procedure Suprimir (Raiz: in out TipoArbol; ValSup: in TipoElem); function Esta (Raiz: in TipoArbol; Buscado: in TipoElem) return Boolean;procedure Limpiar (Ptr: in out TipoArbol);function Izq (Ptr: TipoArbol) return TipoArbol; function Der (Ptr: TipoArbol) return TipoArbol; function Info (Ptr: TipoArbol) return TipoElem; ArbolVacio: exception;

Page 10: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

19

with Ada.Unchecked_Deallocation; package body Arbol isprocedure Free is new Ada.Unchecked_Deallocation(TipoNodo, TipoArbol);

function Vacio (Raiz: TipoArbol) return Boolean is begin

return Raiz = null;end Vacio;

procedure Limpiar (Ptr: in out TipoArbol) isbegin

if not Vacio (Ptr) thenLimpiar (Ptr.Izq); Limpiar (Ptr.Der);Free (Ptr);

end if;end Limpiar;

Alg

orítm

ica

y P

rogr

amac

ión

II

20

[Dale 2003]

Operación Insertar

Page 11: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

21

procedure Insertar (Raiz: in out TipoArbol; Elemento: in TipoElem) isNuevoNodo: TipoArbol:= new TipoNodo'(Elemento, null, null);Ptr: TipoArbol:= Raiz;Anterior: TipoArbol:= null;begin-- el nodo creado contiene el elemento y se inserta en el lugar apropiado del ABB

while Ptr /= null loop -- busca hasta que ptr caiga del árbolAnterior:= Ptr;if Ptr.Info > Elemento then Ptr:= Ptr.Izq;else Ptr:= Ptr.Der;end if;

end loop;-- se encontró lugar de inserción. Conectar punteros para enlazar NuevoNodo al

árbolif Anterior = null then Raiz:= NuevoNodo;else if Anterior.Info > Elemento

then Anterior.Izq:= NuevoNodo;else Anterior.Der:= NuevoNodo ;end if;

end if;end Insertar;

Alg

orítm

ica

y P

rogr

amac

ión

II

22

Procedimiento Insertar Versión recursiva

procedure Insertar (Raiz: in out TipoArbol; Elemento: in TipoElem) is

begin

if Raiz = null then Raiz:= new TipoNodo'(Elemento, null, null);

elsif Elemento < Raiz.Info then Insertar (Raiz.Izq, Elemento);

else Insertar (Raiz.Der, Elemento);

end if;

end Insertar;

Page 12: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Operación insertar recursiva

23[Dale 2003]

Insertar Elemento=13

Alg

orítm

ica

y P

rogr

amac

ión

II

Operación Suprimir

Esta operación involucra dos pasos:1. Encontrar el nodo en el árbol.2. Borrar el nodo del árbol.

El segundo paso requiere el análisis de trescasos: Borrar un nodo hoja Borrar un nodo que tiene un hijo Borrar un nodo que tiene dos hijos

Encontrar el predecesor (nodo más a la derecha delsubárbol izquierdo)

Reemplazar los datos del nodo a borrar con los datosdel predecesor

Borrar el nodo predecesor24

Page 13: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

25

[Dale 2003]

Eliminar un nodo hoja

Eliminar un nodo con un hijo

Operación SuprimirA

lgor

ítmic

a y

Pro

gram

ació

n II

26

[Dale 2003]

Eliminar un nodo con dos hijos

Operación Suprimir

Page 14: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

27

[Dale 2003]

Supresión de un ABBA

lgor

ítmic

a y

Pro

gram

ació

n II

28

procedure suprimir (arbol: in out tipoarbol; valsup: in tipoelem) is

begin

if arbol = null then raise arbolVacio;

elsif valsup = arbol.Info then suprimirnodo (arbol);

elsif valsup < arbol.Info then suprimir (arbol.izq, valsup);

else suprimir (arbol.der, valsup);

end if;

end suprimir;

Page 15: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

29

procedure suprimirnodo (arbol : in out tipoarbol) istemp: tipoarbol;max: tipoarbol;begin

if arbol.izq = null and arbol.der = null then Free(arbol);elsif arbol.izq = null then temp:= arbol;

arbol:= arbol.der ;Free (temp);

elsif arbol.der = null then temp:= arbol;arbol:= arbol.izq;Free (temp);

else buscarMax (arbol.izq, max);arbol.info := max.Info;Free (max);

end if;end suprimirnodo;

Alg

orítm

ica

y P

rogr

amac

ión

II

30

procedure buscarMax (arbol: in out tipoarbol; maxPtr: out tipoarbol) is

begin

if arbol.der = null then MaxPtr:= arbol;

arbol:= arbol.izq;

else buscarMax (arbol.der, maxPtr);

end if;

end buscarMax;

Page 16: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

31

function Esta (Raiz: in TipoArbol; Buscado: in TipoElem) return Boolean is -- iterativo Ptr: TipoArbol:= Raiz;ValorEnArbol: Boolean:= False; begin

while Ptr /= null and not ValorEnArbol loopif Ptr.Info = Buscado then ValorEnArbol:= True;else if Ptr.Info > Buscado then Ptr:= Ptr.Izq;

else Ptr:= Ptr.Der;end if;

end if;end loop;return ValorEnArbol;

end Esta;

function Esta (Raiz: in TipoArbol; Buscado: in TipoElem) return Boolean is -- recursivobegin

if Vacio(raiz) then return False;else if raiz.Info = Buscado then return True;

else if raiz.Info > Buscado then return Esta(raiz.Izq, buscado);else return Esta(raiz.Der, buscado);end if;

end if;end if;

end Esta;

Alg

orítm

ica

y P

rogr

amac

ión

II

Otras operaciones útiles

32

function Izq (ptr: TipoArbol) return TipoArbol isbegin

return ptr.izq;end izq;

function Der (ptr: TipoArbol) return TipoArbol isbegin

return ptr.der;end der;

function Info (ptr: TipoArbol) return TipoElem isbegin

if Vacio(ptr) then raise ArbolVacio,else return ptr.info;

end Info;

Page 17: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Nivel de aplicación

Comparación del ABB con la lista enlazadaordenada. El ABB es una estructura adecuada para muchas

de las mismas aplicaciones de la lista enlazadaordenada. La principal ventaja de usar un ABB esque facilita la búsqueda es especialmenteadecuado para aplicaciones en que el tiempo debúsqueda se debe minimizar o en las que losnodos no serán procesados en orden secuencial.

El ABB ocupa más espacio en memoria que unalista enlazada y los algoritmos para manipularloson más complicados.

33

Alg

orítm

ica

y P

rogr

amac

ión

II

Ejemplo

Función que cuenta los nodos no hoja de unABB.

function Nohoja (Arbol:Tipo_Arbol) return natural is

begin

if Vacio(Arbol) then return 0;

else if not Vacio(Izq(Arbol)) or not Vacio(Der(Arbol)) then

return 1+ Nohoja (Izq(Arbol)) + Nohoja(Der(Arbol));

else return Nohoja (Izq(Arbol)) + Nohoja(Der(Arbol));

end if;

end if;

end Nohoja;

34

Page 18: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorridos en un ABB

Recorrer un árbol significa visitar sus nodos, seapara imprimir la información de cada uno o pararealizar otro procesamiento.

Para acceder a la información del árbol se debepartir desde la raíz y desde ahí, avanzar hacia laizquierda o la derecha.

Ejemplo: para imprimir los valores del árbol enorden de menor a mayor, primero se imprimenlos valores del subárbol izquierdo de la raíz,luego el valor del nodo raíz y finalmente losvalores del subárbol derecho de la raíz.

35

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido InOrden de un ABB

36

Raíz Imprimir segundo

Imprimir al final

Imprimir primero

Page 19: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido InOrden de un ABB

Al “moverse” hacia el subárbol izquierdo, se“pierde” el puntero a la raíz y no se puedevolver atrás. Esto ocurre cada vez que seactualiza el puntero hacia la izquierda.

Considerando que para cada nodo se debeimprimir su subárbol izquierdo, luego el nodoy a continuación su subárbol derecho, ¿quérecurso se puede usar para resolver esa“vuelta atrás”?

37

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido InOrden de un ABB

La estructura de datos que resuelve esemodelo de “vuelta atrás” es la pila. Así escomo se recorren las ramas de la izquierdamientras es posible (Izq ≠ Nulo) y se vaapilando el puntero a cada nodo por el quese pase:

mientras P /= Nulo hacercomienza

meter(PilaPun, P)P ← P.Izq

termina38

Page 20: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido InOrden de un ABB

P es Nulo cuando el subárbol izquierdo estávacío. Entonces hay que retroceder hacia laraíz. ¿Cómo se hace?

Se saca de la pila cada puntero, se imprimela información del nodo apuntado por P y secomienza a recorrer el subárbol derechorepitiendo la misma rutina. ¿Cuándo finaliza?Cuando P sea nulo y la pila esté vacía.

39

Alg

orítm

ica

y P

rogr

amac

ión

II

N

E

K

S

Inicio

PilaPun

RaizP

N

E

K

S

PilaPun

Fin del primer bucle while

↑N↑E

P Nulo

N

E

K

S

PilaPun

Sacar y escribir

↑N

P

Salida: E

N

E

K

S

PilaPun

↑N

P

Obtener subárbolderecho

Salida: E

N

E

K

S

PilaPun

↑N

↑K

P Nulo

Bucle while (ir izquierda)

Salida: E

N

E

K

S

PilaPun

↑N

P

Salida: E K

Sacar y escribir

40

Page 21: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

N

E

K

S

Obtener subarbol derecho

PilaPun

N

E

K

S

PilaPun

P Nulo

N

E

K

S

PilaPun

Sacar y escribir

P

N

E

K

S

PilaPun

↑S

P

Bucle while (ir izquierda)

N

E

K

S

PilaPun

P Nulo

Sacar y escribirN

E

K

S

PilaPun

Salida: E K

↑N

P

Salida: E K N

Ir a la derecha

Nulo

Salida: E K N Salida: E K N

Salida: E K N S Salida: E K N S

Ir a la derecha

P Nulo

41

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido Inorden

InOrden: B D E H K M N Q R S T V W Z

RaizN

MHB

KD

E S

R

Q

W

ZV

T

42

Page 22: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido InOrden de un ABB

procedure InOrden (Ptr: in TipoArbol) isbegin -- inorden iterativo

Limpiar (PilaPun);P:= Raiz;loop

while P/= null loopMeter (PilaPun, P);P:= P.Izq;

end loop;-- si existe algo en la pila, sacar, imprimir y mover a la derechaif not Pila.Vacia(PilaPun) then

Sacar (PilaPun,P);Imprimir (P.Info);P:= P.Der;

end if;exit when P=null and Vacia (PilaPun);

end loop;end InOrden;

43

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorridos recursivos del ABB

Recorrido InOrdenDefinición: recorre todos los nodos del ABB,visitando cada nodo entre su subárbol izquierdo y susubárbol derecho. Imprime todos los elementos delABB en orden de menor a mayor.Tamaño: Todos los nodos del árbol.Caso base: P=Nulo.Caso general: Recorrer el subárbol izquierdo en

Inorden.Imprimir Info(P)Recorrer el subárbol derecho en Inorden.

44

Page 23: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido InOrden recursivo

procedure InOrden (Ptr: in TipoArbol) is

begin

if not Vacio(Ptr) then InOrden (Izq(Ptr));

Put (Info(Ptr));

InOrden (Der(Ptr));

end if;

end InOrden;

45

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorridos recursivos del ABB

Recorrido PreOrdenDefinición: recorre todos los elementos del árbolbinario, visitando cada nodo antes que su subárbolizquierdo y su subárbol derecho.Tamaño: Todos los nodos del árbol.Caso base: P=Nulo.Caso general: Imprimir Info(P)

Recorrer el subárbol izquierdo en PreOrden.Recorrer el subárbol derecho en PreOrden.

46

Page 24: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido Preorden

PreOrden: N E D B K H M S R Q W V T Z47

RaizN

MHB

KD

E S

R

Q

W

ZV

T

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido PreOrden recursivo

procedure PreOrden (Ptr: in TipoArbol) is

begin

if not Vacio(Ptr) then Put (Info(Ptr));

PreOrden (Izq(Ptr));

PreOrden (Der(Ptr));

end if;

end PreOrden;

48

Page 25: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorridos recursivos del ABB

Recorrido PosOrdenDefinición: recorre todos los elementos del árbolbinario, visitando cada nodo después que susubárbol izquierdo y su subárbol derecho.Tamaño: Todos los nodos del árbol.Caso base: P=Nulo.Caso general: Recorrer el subárbol izquierdo en

PosOrden.Recorrer el subárbol derecho en PosOrden.Imprimir Info(P)

49

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido Posorden

PosOrden: B D H M K E Q R T V Z W S N50

RaizN

MHB

KD

E S

R

Q

W

ZV

T

Page 26: AlgoritmicaII-Arbol Binario de Busqueda

Alg

orítm

ica

y P

rogr

amac

ión

II

Recorrido PosOrden recursivo

procedure PosOrden (Ptr: in TipoArbol) is

begin

if not Vacio(Ptr) then PosOrden (Izq(Ptr));

PosOrden (Der(Ptr));

Put (Info(Ptr));

end if;

end PosOrden;

51