You are on page 1of 26

Algortmica y Programacin II

rbol Binario de Bsqueda

Nivel lgico
Qu es un rbol?

Algortmica y Programacin II

Las imgenes representan distintos objetos pero


cada uno ilustra un concepto comn: un rbol.
Un rbol es una estructura de datos en forma
jerrquica o de niveles, en cuyos elementos
puede existir una relacin de uno a muchos (1:n).

Terminologa bsica

Algortmica y Programacin II

Nodo raz: primer elemento de un rbol. No


tiene ascendiente.
Nodo padre: nodo que tiene por lo menos un
hijo.
Hijo: descendiente de un nodo.
Nodo hoja: nodo que no tiene descendiente.
Nodos hermanos: nodos con un mismo
padre.
Rama: relacin que conecta un padre con un
hijo.
3

Terminologa bsica

Algortmica y Programacin II

Ancestro: nodo padre de un nodo o padre de


algn nodo ancestro.
Descendiente: hijo de un nodo o hijo de otro
descendiente de ese nodo.
Subrbol: conjunto de descendientes de un
nodo por una de las ramas.
Nivel de un nodo: distancia desde la raz.
Esta es el nivel cero.
Grado de un nodo: nmero de hijos que
tiene.
4

Algortmica y Programacin II

Nodo
raz

Nivel 0

Subrbol
Nodos
hoja

Nivel 2

o Hijo izquierdo de nodo raz: nodo


que contiene 3.

Algortmica y Programacin II

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 Subrbol derecho de nodo raz:
tiene como raz al nodo que
contiene 10.
6

rbol rbol binario

Algortmica y Programacin II

rbol general: aquel en el que no se


considera ninguna limitacin en el grado
mximo de sus nodos. Los rboles n-arios
son aquellos en los que el grado mximo de
sus nodos es n, siendo n un nmero positivo.
rbol binario: aquel en que cada nodo tiene
como mximo dos hijos.

rbol Binario de Bsqueda

Algortmica y Programacin II

Estructura de datos que guarda informacin no


repetida, en el que cada nodo apunta como mximo
a dos nodos y adems cumple con un ordenamiento
de modo que para cada elemento del ABB, los
elementos menores estn a su izquierda (subrbol
izquierdo) y los mayores a su derecha (subrbol
derecho).

Qu
operaciones
necesitan?

Algortmica y Programacin II

se

Crear
Insertar
Suprimir
Vaco
Buscar
Limpiar

Especificacin del TAD ABB

Algortmica y Programacin II

Funcin de acceso: la ubicacin de cada elemento


en el rbol satisface la siguiente regla: el valor de la
clave de un elemento es mayor que el valor de la
clave de cualquier elemento en su subrbol
izquierdo y menor que el valor de la clave de
cualquier elemento en su subrbol derecho.

Crear(Arbol)
Funcin:
Entrada:
Precondiciones:
Salida:
Poscondiciones:

Inicializar Arbol al estado vaco.


Ninguna.
Ninguna.
Arbol.
Arbol est vaco.

10

Algortmica y Programacin II

Especificacin del TAD ABB


Vacio(Arbol)
Funcin:
Entrada:
Precondiciones:
Salida:
Poscondiciones:

Indicar si Arbol est vaco.


Arbol a ser testeado.
Arbol existe.
Vacio (valor booleano).
Vacio = (el rbol est vaco).

11

Algortmica y Programacin II

Especificacin del TAD ABB


Suprimir(Arbol, ValSup)
Funcin:
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 se
modifica.
12

Algortmica y Programacin II

Especificacin del TAD ABB


Insertar(Arbol, NuevoElemento)
Funcin:
Aadir NuevoElemento a Arbol.
Entrada:
Arbol, NuevoElemento.
Precondiciones:
Arbol existe.
Salida:
Arbol (cambiado).
Poscondiciones:
Arbol = Arbol
original +
NuevoElemento.

13

Algortmica y Programacin II

Especificacin del TAD ABB


Esta(Arbol,Valor)
Funcin:
Indicar si Valor pertenece a Arbol.
Entrada:
Arbol, Valor.
Precondiciones: Arbol existe.
Salida:
Esta (valor booleano)
Poscondiciones: Esta = (Valor pertenece a Arbol)

14

Especificacin del TAD ABB

Algortmica y Programacin II

Limpiar(Arbol)
Funcin:

Liberar los nodos que pudieran


existir en Arbol.
Entrada:
Arbol a vaciar.
Precondiciones: Arbol existe
Salida:
Arbol (vaco)
Poscondiciones: Arbol est vaco.

15

Algortmica y Programacin II

Especificacin del TAD ABB


Buscar(Arbol, clave, infoNodo, encontrado)
Funcin:
Buscar el nodo clave y devolver los
datos asociados. Devuelve falso si
no pertenece.
Entrada:
Arbol y clave.
Precondiciones: Arbol no es vaco
Salida:
infoNodo, encontrado
Poscondiciones:infoNodo = datos del nodo que
contiene clave si est en el rbol;
en ese caso encontrado es
verdadero, en caso contrario es
falso.

16

Algortmica y Programacin II

TAD ABB
type TipoNodo;
type TipoArbol is access TipoNodo;
type TipoNodo is
record
Info: TipoElem;
Izq, Der: TipoArbol;
end record;

TipoNodo
Info

Puntero a la raz del


subrbol izquierdo

Puntero a la raz del


subrbol derecho

Algortmica y Programacin II

17

generic
type 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;

18

Algortmica y Programacin II

with Ada.Unchecked_Deallocation;
package body Arbol is
procedure 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) is
begin
if not Vacio (Ptr) then
Limpiar (Ptr.Izq);
Limpiar (Ptr.Der);
Free (Ptr);
end if;
end Limpiar;

19

Algortmica y Programacin II

Operacin Insertar

[Dale 2003]
20

Algortmica y Programacin II

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


NuevoNodo: 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 rbol
Anterior:= Ptr;
if Ptr.Info > Elemento then Ptr:= Ptr.Izq;
else Ptr:= Ptr.Der;
end if;
end loop;
-- se encontr lugar de insercin. Conectar punteros para enlazar NuevoNodo al
rbol
if Anterior = null then Raiz:= NuevoNodo;
else if Anterior.Info > Elemento
then Anterior.Izq:= NuevoNodo;
else Anterior.Der:= NuevoNodo ;
end if;
end if;
end Insertar;

21

Algortmica y Programacin II

Procedimiento Insertar Versin 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;

22

Operacin insertar recursiva

Algortmica y Programacin II

Insertar
Elemento=13

[Dale 2003]

23

Operacin Suprimir

Esta operacin involucra dos pasos:

Algortmica y Programacin II

1.
2.

Encontrar el nodo en el rbol.


Borrar el nodo del rbol.

El segundo paso requiere el anlisis de tres


casos:

Borrar un nodo hoja


Borrar un nodo que tiene un hijo
Borrar un nodo que tiene dos hijos

Encontrar el predecesor (nodo ms a la derecha del


subrbol izquierdo)
Reemplazar los datos del nodo a borrar con los datos
del predecesor
Borrar el nodo predecesor

24

Operacin Suprimir

Algortmica y Programacin II

Eliminar un nodo hoja

Eliminar un nodo con un hijo

[Dale 2003]
25

Operacin Suprimir

Algortmica y Programacin II

Eliminar un nodo con dos hijos

[Dale 2003]
26

Algortmica y Programacin II

Supresin de un ABB

[Dale 2003]
27

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


begin
if arbol = null then raise arbolVacio;
elsif valsup = arbol.Info then suprimirnodo (arbol);
Algortmica y Programacin II

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


else suprimir (arbol.der, valsup);
end if;
end suprimir;

28

Algortmica y Programacin II

procedure suprimirnodo (arbol : in out tipoarbol) is


temp: 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;
29

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


begin
if arbol.der = null then MaxPtr:= arbol;
arbol:= arbol.izq;
Algortmica y Programacin II

else buscarMax (arbol.der, maxPtr);


end if;
end buscarMax;

30

Algortmica y Programacin II

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 loop
if 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 -- recursivo
begin
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;

31

Otras operaciones tiles

Algortmica y Programacin II

function Izq (ptr: TipoArbol) return TipoArbol is


begin
return ptr.izq;
end izq;

function Der (ptr: TipoArbol) return TipoArbol is


begin
return ptr.der;
end der;
function Info (ptr: TipoArbol) return TipoElem is
begin
if Vacio(ptr) then raise ArbolVacio,
else return ptr.info;
end Info;
32

Nivel de aplicacin

Algortmica y Programacin II

Comparacin del ABB con la lista enlazada


ordenada.
El ABB es una estructura adecuada para muchas
de las mismas aplicaciones de la lista enlazada
ordenada. La principal ventaja de usar un ABB es
que facilita la bsqueda es especialmente
adecuado para aplicaciones en que el tiempo de
bsqueda se debe minimizar o en las que los
nodos no sern procesados en orden secuencial.
El ABB ocupa ms espacio en memoria que una
lista enlazada y los algoritmos para manipularlo
son ms complicados.

33

Ejemplo

Algortmica y Programacin II

Funcin que cuenta los nodos no hoja de un


ABB.

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

Recorridos en un ABB

Algortmica y Programacin II

Recorrer un rbol significa visitar sus nodos, sea


para imprimir la informacin de cada uno o para
realizar otro procesamiento.
Para acceder a la informacin del rbol se debe
partir desde la raz y desde ah, avanzar hacia la
izquierda o la derecha.
Ejemplo: para imprimir los valores del rbol en
orden de menor a mayor, primero se imprimen
los valores del subrbol izquierdo de la raz,
luego el valor del nodo raz y finalmente los
valores del subrbol derecho de la raz.
35

Algortmica y Programacin II

Recorrido InOrden de un ABB

Raz

Imprimir
primero

Imprimir
segundo

Imprimir
al final

36

Recorrido InOrden de un ABB

Algortmica y Programacin II

Al moverse hacia el subrbol izquierdo, se


pierde el puntero a la raz y no se puede
volver atrs. Esto ocurre cada vez que se
actualiza el puntero hacia la izquierda.
Considerando que para cada nodo se debe
imprimir su subrbol izquierdo, luego el nodo
y a continuacin su subrbol derecho, qu
recurso se puede usar para resolver esa
vuelta atrs?
37

Recorrido InOrden de un ABB

Algortmica y Programacin II

La estructura de datos que resuelve ese


modelo de vuelta atrs es la pila. As es
como se recorren las ramas de la izquierda
mientras es posible (Izq Nulo) y se va
apilando el puntero a cada nodo por el que
se pase:
mientras P /= Nulo hacer
comienza
meter(PilaPun, P)
P P.Izq
termina
38

Recorrido InOrden de un ABB


P es Nulo cuando el subrbol izquierdo est
vaco. Entonces hay que retroceder hacia la
raz. Cmo se hace?
Se saca de la pila cada puntero, se imprime
la informacin del nodo apuntado por P y se
comienza a recorrer el subrbol derecho
repitiendo la misma rutina. Cundo finaliza?
Cuando P sea nulo y la pila est vaca.

Algortmica y Programacin II

39

Raiz
P

Inicio

Fin del primer bucle


while
S

PilaPun

PilaPun

Sacar y escribir

Nulo

Algortmica y Programacin II

E
N

Obtener subrbol
derecho

N
P

PilaPun

Salida: E

Salida: E
N
N

Sacar y escribir

Bucle while (ir


izquierda)

N
P

Nulo
PilaPun

Salida: E

PilaPun

P
PilaPun

Salida: E K
40

Obtener subarbol derecho

P Sacar y escribir

E
S

Nulo

Salida: E K N

PilaPun

Salida: E K

Algortmica y Programacin II

Nulo

Bucle while (ir izquierda)

Ir a la derecha

PilaPun

P
S

S
Nulo

PilaPun

PilaPun

Salida: E K N

Salida: E K N
N

Ir a la derecha

Sacar y escribir
S

P
PilaPun

Nulo

PilaPun

Salida: E K N S

Salida: E K N S

41

Recorrido Inorden
Raiz
Algortmica y Programacin II

InOrden:

BDEHKMNQRSTVWZ
42

Algortmica y Programacin II

Recorrido InOrden de un ABB


procedure InOrden (Ptr: in TipoArbol) is
begin -- inorden iterativo
Limpiar (PilaPun);
P:= Raiz;
loop
while P/= null loop
Meter (PilaPun, P);
P:= P.Izq;
end loop;
-- si existe algo en la pila, sacar, imprimir y mover a la derecha
if 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

Recorridos recursivos del ABB

Algortmica y Programacin II

Recorrido InOrden
Definicin: recorre todos los nodos del ABB,
visitando cada nodo entre su subrbol izquierdo y su
subrbol derecho. Imprime todos los elementos del
ABB en orden de menor a mayor.
Tamao:
Todos los nodos del rbol.
Caso base:
P=Nulo.
Caso general: Recorrer el subrbol izquierdo en
Inorden.
Imprimir Info(P)
Recorrer el subrbol derecho en
Inorden.
44

Recorrido InOrden recursivo


procedure InOrden (Ptr: in TipoArbol) is

Algortmica y Programacin II

begin
if not Vacio(Ptr) then InOrden (Izq(Ptr));
Put (Info(Ptr));
InOrden (Der(Ptr));
end if;
end InOrden;

45

Recorridos recursivos del ABB

Algortmica y Programacin II

Recorrido PreOrden
Definicin: recorre todos los elementos del rbol
binario, visitando cada nodo antes que su subrbol
izquierdo y su subrbol derecho.
Tamao:
Todos los nodos del rbol.
Caso base:
P=Nulo.
Caso general: Imprimir Info(P)
Recorrer el subrbol izquierdo en
PreOrden.
Recorrer el subrbol derecho en
PreOrden.
46

Recorrido Preorden
Raiz
Algortmica y Programacin II

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

Recorrido PreOrden recursivo


procedure PreOrden (Ptr: in TipoArbol) is

Algortmica y Programacin II

begin
if not Vacio(Ptr) then Put (Info(Ptr));
PreOrden (Izq(Ptr));
PreOrden (Der(Ptr));
end if;
end PreOrden;

48

Recorridos recursivos del ABB

Recorrido PosOrden

Algortmica y Programacin II

Definicin: recorre todos los elementos del rbol


binario, visitando cada nodo despus que su
subrbol izquierdo y su subrbol derecho.
Tamao:
Todos los nodos del rbol.
Caso base:
P=Nulo.
Caso general: Recorrer el subrbol izquierdo en
PosOrden.
Recorrer el subrbol derecho en
PosOrden.
Imprimir Info(P)
49

Recorrido Posorden
Raiz
Algortmica y Programacin II

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

Recorrido PosOrden recursivo


procedure PosOrden (Ptr: in TipoArbol) is

Algortmica y Programacin II

begin
if not Vacio(Ptr) then PosOrden (Izq(Ptr));
PosOrden (Der(Ptr));
Put (Info(Ptr));
end if;
end PosOrden;

51

You might also like