You are on page 1of 95

Algoritmos y Estructuras de Datos

ACI600
Escuela de Ingeniera

Unidad V: Tipos de datos abstractos


Clase 9: Introduccin a las estructuras dinmicas y diccionario

MATERIAL PROPIEDAD DE UDLA.


AUTORIZADA SU UTILIZACIN SLO PARA FINES ACADMICOS.

Introduccin a las estructuras dinmicas

La estructuras dinmicas son estructuras cuya


dimensin puede crecer o disminuir durante la
ejecucin del programa.
Una estructura dinmica de datos es una coleccin
de nodos.
lista
siguiente

Informacin2

Informacin3
Nulo

Informacin2.5

Introduccin a las estructuras dinmicas

Las estructuras dinmicas son de gran utilidad para


almacenar datos del mundo real.
La insercin de elementos en estructuras dinmicas
suele ser ms rpida.
0

k-1

k+1

n-2 n-1

arreglo[n] =

mover cada valor


x

Tipo de dato abstracto

Un Tipo de dato abstracto (TDA) es un conjunto de


datos u objetos al cual se le asocian operaciones.
El TDA provee de una interfaz pblica con la cual es
posible realizar las operaciones permitidas,
abstrayndose de la manera en como estn
implementadas dichas operaciones.
Ejemplos: Listas, rboles y colas

Tipo de dato abstracto

Un mismo TDA puede ser implementado utilizando


distintas estructuras de datos y proveer la misma
funcionalidad.
Al poseer caracterstica de caja negra, el usuario del
TDA ignora su estructura, no la necesita.

Necesito administrar la cola del banco

TDA
Entra alguien a la cola
Sale alguien de la cola

Tipo de dato abstracto

La diferencia entre un TDA y una estructura de dato


es que la primera tiene operaciones bien definidas,
mientras la segunda es slo una estructura,
usualmente para ser utilizada como representacin
de un TDA.

TDA
Estructura

Interfaz

TDA Diccionario

Un TDA Diccionario es una coleccin de pares


llave/valor.
Se puede acceder a un elemento del diccionario, o
establecer ste, mediante su llave y operador de
subndice.
Imagen

Dominio

a
llave

Diccionario d

d(a)
valor

TDA Diccionario

Un TDA Diccionario posee las siguientes operaciones:


bsqueda(X): dado un elemento X, conocido como llave de
bsqueda, encontrarlo dentro del conjunto o decir que no
est
insercin(X): agregar un nuevo elemento X al conjunto
eliminacin(X): eliminar el elemento X del conjunto
Cambiar(X): actualizar el valor X del conjunto (opcional)
Necesito un directorio de personas

TDA Diccionario
Busca elementos
Inserta elementos
Elimina elementos

TDA Diccionario

Las reglas de un Diccionario son las siguientes:


No se admiten dos valores tengan la misma clave
Si se adiciona una valor a una clave que ya existe, entonces
se modifica el valor que antes se almacenaba.

Ingreso a Juan Perez

Ingreso a Jos Gonzlez

Juan Perez
Jos Gonzlez

Ingreso o modifico a Juan Perez

TDA Diccionario

Si dos valores tienen la misma clave, entonces el tamao


del diccionario aumenta.

Ingreso a RUT 1 Juan Perez

Ingreso a RUT 1 Fono 12345678

Juan Perez

Juan Perez

12345678

TDA Diccionario: Implementacin

Para la implementacin se utilizar un objeto del tipo


llave/valor.
Ejemplo
interface Comparable{
int compareTo(Object x);
}
class Registro{
public Comparable palabra;
public Object significado;
public Registro(Object x,Object y){
palabra=x; significado=y;
}
}

TDA Diccionario: Implementacin

El diccionario debe facilitar la bsqueda, por lo que


debe ser eficiente en encontrar las llaves.
Ejemplo
class Diccionario{
protected static final int N=100;
protected int n;
protected Registro[] reg;
public Diccionario(){
reg=new Registro[N]; n=0;
}
public Object buscar(Comparable x){
int i=indice(x);
return i<0 ? null : reg[i].significado;
}
public boolean cambiar(Comparable x,Object y){
int i=indice(x);
if(i<0) return false;
reg[i].significado = y;
return true;
}

TDA Diccionario: Implementacin

La funcin ndice encuentra el valor a travs de


bqueda binaria O(log n) .
Ejemplo
protected int indice(Comparable x){
//repetir mientras queden elementos
int ip=0,iu=n-1;
while(ip<=iu)
{
//comprobar si est justo en la mitad
int im=(ip+iu)/2;
int c=reg[im].palabra.compareTo(x);
if(c==0) return im;
//descartar la mitad del arreglo
if(c<0) ip=im+1; else iu=im-1;
}
//entregar 1 si no est
return -1;
}

TDA Diccionario: Implementacin

Al utilizar un arreglo en el ejemplo se debe realizar la


funcin borrar en O(n).
Ejemplo
public boolean borrar(Comparable x)
{
//buscar palabra: O(log2n)
int i=indice(x);
if(i<0) return false;
//subir elementos siguientes: O(n)
for(int j=i;j<n-1;++j)
reg[j]=reg[j+1];
//decrementar n de elementos
--n;
return true;
}

TDA Diccionario: Implementacin

El mismo caso anterior para la funcin agregar.


El diccionario realiza en menor tiempo la bsqueda.
Ejemplo
public boolean agregar(Comparable x,Object y) throws DiccLleno{
//buscar palabra x: O(log2n)
if(indice(x)>=0) return false; //O(log2n)
if(n>=N) throw new DiccLleno();
//bajar elementos: O(n)
int i;
for(i=n-1; i>=0 ;--i){
if(reg[i].palabra.compareTo(x)<0) break;
reg[i+1]=reg[i];
}
//incrementar elementos
reg[i+1]=new Registro(x,y); ++n;
return true;
}

Algoritmos y Estructuras de Datos


ACI600
Escuela de Ingeniera

Unidad V: Tipos de datos abstractos


Clase 10: Listas

MATERIAL PROPIEDAD DE UDLA.


AUTORIZADA SU UTILIZACIN SLO PARA FINES ACADMICOS.

Definicin

Una lista se define como una serie de N elementos


E1, E2, ..., EN, ordenados de manera consecutiva.
Si la lista contiene 0 elementos se denomina como
lista vaca.
Pueden existir
elementos repetidos.
Puede accederse,
insertarse y borrarse
en cualquier posicin.

Definicin

La interfaz del TDA Lista es el siguiente:

vacia(): devuelve verdadero si la lista esta vaca


insertar(x, i): inserta el elemento x en la posicin i
buscar(x): devuelve la posicin en la lista del elemento x
buscar(i): devuelve el i-simo elemento de la lista
eliminar(x): elimina de la lista el elemento x

Aplicaciones

Recuperacin de informacin, traduccin de


lenguajes de programacin o simulacin.
Listado To Do
Explorador de directorios
Listados ordenados con
bsqueda de cualquier
elemento

Comparacin implementaciones

Las principales diferencias entre usar arreglo y lista


enlazada son:
buscar(i) es ms rpido usando arreglos: O(1)
Al utilizar arreglos insertar(x,i) debe crear nuevo listado
si se llena el arreglo.
eliminar(x) debe mover elementos delante de x si se
utiliza arreglos.
El tamao de la lista enlazada es variable, nunca se llena y
utiliza espacio en memoria dinmica.

Representacin

La representacin en este caso se realiza mediante


una lista enlazada de nodos.
Ejemplo
class Nodo{
public Object valor;
public Nodo sgte;
public Nodo(Object x,Nodo y){
valor=x; sgte=y;
}
}
class Lista
{
protected Nodo primero;
public Lista(){
primero=null;
}
public boolean vacia(){
return primero==null;
}

Representacin

Se soluciona el inconveniente de perder referencia al


primer elemento al eliminar/agregar elementos con
una referencia fija al primer elemento llamado
primero.

lista
sgte

valor1

sgte

valor2

sgte

valor3
Nulo

primero

Operaciones

La funcin buscar recorre la lista hasta encontrar el


elemento.
Realiza la operacin en O(n).
Ejemplo
public int buscar(Object x)
{
int i=0;
//repetir hasta fin de lista enlazada
Nodo r=primero;
while(r!=null)
{
//si se encuentra devolver ndice
if(r.valor.equals(x)) return i;
//pasar a siguiente nodo
++i;
r=r.sgte;
}
return -1;
}

Operaciones

La bsqueda por ndice recorre la lista enlazada x


veces.
La operacin demora O(n).
Ejemplo
public Object buscar(int x)
{
int i=0;
//recorrer lista enlazada
for(Nodo r=primero; r!=null; r=r.sgte)
{
//devolver valor en ndice x
if(i==x) return r.valor;
++i;
}
return null;
}

Operaciones

Para eliminar un nodo, se ubica y luego se elimina su


referencia.
ndice i con valor x
r

r
sgte . sgte

valor1

sgte

valor i-1

valor i

valor i+1
Nulo

primero

Operaciones

La operacin demora O(n).


Ejemplo
public void eliminar(Object x)
{
if(vacia()) return;
if(primero.valor.equals(x)){
primero=primero.sgte; return;
}
//caso general
for(Nodo r=primero; r.sgte!=null; r=r.sgte)
if(r.sgte.valor.equals(x)){
r.sgte=r.sgte.sgte;//borrar
return;
}
}

Operaciones

En la insercin se crea el nodo en la posicin i.

ndice i-1
r

ndice nuevo i+1

r
sgte . sgte

Informacin 1

sgte

Informacin i-1

Informacin i
Nulo

primero

sgte

Informacin i

sgte

Operaciones

Se debe recorrer el listado con un tiempo de O(n).


Ejemplo
public void insertar(Object x,int i) throws ListaLlena
{
if(i==0){
primero=new Nodo(x,primero); return;
}
int j=0;
for(Nodo r=primero; r!=null; r=r.sgte){
if(j==i-1){
r.sgte=new Nodo(x,r.sgte); return;
}
++j;
}
}

Eliminacin de recursividad

Cuando el llamado recursivo se realiza al final de una


funcin (tail recursion), la recursin se puede
eliminar utilizando un ciclo.
Ejemplo
void imprimir(int[] a, int j) // versin recursiva {
if (j<a.length) {
System.out.println(a[j]);
imprimir(a, j+1); // tail recursion
}
}
void imprimir(int[] a, int j) // versin iterativa {
while (j<a.length) {
System.out.println(a[j]);
j=j+1;
}
}

Eliminacin de recursividad

Cuando el llamado recursivo se realiza en medio de


una funcin, la recursin se puede eliminar utilizando
una pila.
Ejemplo
static void inverso( NodoLista n ) //version recursiva
{
if( n!=null )
{
inverso(n.siguiente);
System.out.print(n.elemento+"->");
}
}

Un mtodo recursivo es menos eficiente que uno no recursivo, pero slo


en pocas oportunidades vale la pena eliminar la recursin.

Eliminacin de recursividad

Los programas no recursivos son ms eficientes.


La eliminacin de recursividad puede quitar claridad.
Ejemplo
static void inverso( NodoLista n ) //version con Pila
{
PilaLista p = new PilaLista();
for(NodoLista r=n; r!=null; r=r.siguiente) {
p.apilar(r);
}
while(!p.estaVacia()){
System.out.print( ((NodoLista)p.desapilar()).elemento+"->");
}
}

Algoritmos y Estructuras de Datos


ACI600
Escuela de Ingeniera

Unidad V: Tipos de datos abstractos


Clase 11: Pilas

MATERIAL PROPIEDAD DE UDLA.


AUTORIZADA SU UTILIZACIN SLO PARA FINES ACADMICOS.

Definicin

Una pila o stack es una lista de elementos de la cual


slo se puede extraer el ltimo elemento insertado.
La posicin en donde se
encuentra dicho elemento
se denomina tope de la pila.
Tambin se conoce a
las pilas como listas LIFO

El trmino LIFO es el acrnimo ingls de Last In First Out (ltimo en


entrar, primero en salir).

Definicin

La interfaz del TDA Pila es el siguiente:


apilar(x) o push: inserta el elemento x en el tope de la pila
desapilar() o pop: retorna y elimina el elemento que se
encuentre en el tope de la pila
apilar
desapilar
tope() o top: retorna el
tope
elemento que se encuentre
1
en el tope de la pila
4
estaVacia() o isEmpty: retorna
9
verdadero si la pila no
3
contiene elementos
5

Aplicaciones

Estructuras auxiliares en numerosos algoritmos:


recorridos de rboles y grafos
evaluacin de expresiones
conversin entre notaciones de expresiones

Botn Deshacer de
los editores de texto.
Botn Atrs
de navegadores.

Redo3
Undo2

Redo2

Undo1

Redo1

Comparacin implementaciones

Al igual que en el TDA Lista, el arreglo tiene un


tamao fijo que en caso de llenarse se debe
reinicializar con un tamao mayor.
El tamao de la lista enlazada es variable, nunca se
llena y utiliza espacio en memoria dinmica.
arreglo[n] =

a0

a1

n-2 n-1
a n-2 a n-1

apilar

a*

arreglo = arreglo2[2*n] =

a0

a1

n-2 n-1

a n-2 a n-1 a*

2*n- 2*n2
1

Representacin

En la implementacin con nodos, el primer elemento


es el tope de la pila.
Ejemplo
class NodoLista
{
Object elemento;
NodoLista siguiente;
NodoLista(Object o, NodoLista n)
{
this.elemento=o;
this.siguiente=n;
}

}
class PilaLista
{
private NodoLista lista;
public PilaLista() {
lista=null;
}

Operaciones

Para apilar se debe agregar un nuevo primer


elemento.
lista

lista
sgte

valor nuevo

sgte

valor1

sgte

valor2
Nulo

Para desapilar simplemente se elimina el primer


elemento.
lista

lista

sgte

sgte

valor1

valor2

sgte

valor3
Nulo

Operaciones

Ambas operaciones son O(1).


Ejemplo
public void apilar(Object x)
{
lista=new NodoLista(x, lista);
}
public Object desapilar() // si esta vacia se produce UNDERFLOW
{
if (!estaVacia()) {
Object x=lista.elemento;
lista=lista.siguiente;
return x;
}
}

Operaciones

Las funciones tope y estaVacia tambin son O(1).


Ejemplo
public Object tope() {
if (!estaVacia()) // si esta vacia es un error
{
Object x=lista.elemento;
return x;
}
}
public boolean estaVacia()
{
return lista==null;
}
}

Algoritmos y Estructuras de Datos


ACI600
Escuela de Ingeniera

Unidad V: Tipos de datos abstractos


Clase 12: Colas

MATERIAL PROPIEDAD DE UDLA.


AUTORIZADA SU UTILIZACIN SLO PARA FINES ACADMICOS.

Definicin

Una cola es una lista en donde se insertan elementos


al final de la lista y se extraen desde el inicio.
El nico elemento observable es el
primero que fue insertado.
Tambin se conoce a las
colas como listas FIFO.

El trmino FIFO es el acrnimo ingls de First In First Out (primero


en entrar, primero en salir).

Definicin

La interfaz del TDA Cola es el siguiente:


encolar(x) o enqueue: inserta el elemento x al final de la
cola
sacar() dequeue: retorna el elemento que se ubica al inicio
de la cola
estaVacia(): retorna verdadero si la cola esta vaca, falso en
caso contrario
Cola
encolar

8 7

5 4

2 1

sacar

Aplicaciones

Colas de trabajos a realizar por una impresora.


Asignacin de tiempo de procesador a los procesos
en un sistema multiusuario (sin prioridad).
Simular situaciones reales:
Cajero automtico
Llamadas en espera

Comparacin implementaciones

Al igual que en el TDA Pila, se puede implementar a


travs de arreglos y listas enlazadas.
El arreglo tiene un tamao fijo que en caso de
llenarse se puede reinicializar con un tamao mayor.
Para optimizar el uso del arreglo se utiliza una
variable que indica el primer elemento.
numElem

0
cola=

k-1

34

primero

ltimo

k+1

n-2 n-1

Implementacin arreglo

El caso ms general es utilizando arreglo circular.


El arreglo circular funciona igual que un lista circular,
pero sin referencias.
numElem2

cola=

numElem1

k+1

k-1

15

10

34

ltimo

primero

numElem = numElem1 + numElem2

n-2 n-1
22

Representacin

Al utilizar arreglo se inicializa el nmero mximo de


datos a utilizar.
Ejemplo
class ColaArreglo
{
private Object[] arreglo;
private int primero, ultimo, numElem;
private int MAX_ELEM=100; // maximo numero de elementos en la
cola
public ColaArreglo()
{
arreglo=new Object[MAX_ELEM];
primero=0;
ultimo=-1;
numElem=0;
}

Operaciones

Al agregar un elemento se verifica que no est lleno


el arreglo.
La operacin demora O(1).
Ejemplo
public void encolar(Object x) {
if (numElem<=MAX_ELEM) // si esta llena se produce OVERFLOW
{
ultimo=(ultimo+1)%MAX_ELEM;
arreglo[ultimo]=x; numElem++;
}
}

La funcin MOD (%) calcula el resto de una divisin.

Operaciones

Al eliminar un elemento se verifica que no est vaco


el arreglo.
Las operaciones demoran O(1).
Ejemplo
public Object sacar()
{
if (!estaVacia()) // si esta vacia se produce UNDERFLOW
{
Object x=arreglo[primero];
primero=(primero+1)%MAX_ELEM;
numElem--;
return x;
}
}
public boolean estaVacia() {
return num_elem==0;
}
}

TDA Cola de Prioridad

Una cola de prioridad es una cola en la que cada


elemento tiene asociada una prioridad.
La operacin de extraccin siempre elige el elemento
de menor prioridad.

prioridades

sacar

TDA Cola de Prioridad

La interfaz del TDA Cola de Prioridad es el siguiente:


encolar(x, p) o enqueue: inserta el elemento x con la
prioridad p
sacar() dequeue: retorna el elemento con mayor prioridad
estaVacia(): retorna verdadero si la cola esta vaca, falso en
caso contrario

TDA Cola de Prioridad: Aplicaciones

La cola de las ciudades ordenadas por su distancia al


destino final.
Las colas de las tareas pendientes ordenadas por su
fecha de terminacin.
Las colas de personas con personas de movilidad
reducida.

TDA Cola de Prioridad: Implementaciones

Tres formas de implementar colas de prioridad son:


Una lista ordenada:
Insercin: O(n)
Extraccin de mximo: O(1)

Una lista desordenada:


Insercin: O(1)
Extraccin de mximo: O(n)

Un rbol binario:

Insercin: O(log(n))
Extraccin de mximo: O(log(n))

4
8

3
5

Algoritmos y Estructuras de Datos


ACI600
Escuela de Ingeniera

Unidad VI: Estructuras de datos NO lineales


Clase 13: rboles generales

MATERIAL PROPIEDAD DE UDLA.


AUTORIZADA SU UTILIZACIN SLO PARA FINES ACADMICOS.

rboles Generales

Un rbol se define como una coleccin de nodos


organizados en forma recursiva.
El rbol consiste en un nodo denominado raz, el cual
tiene 0 o ms referencias a otros rboles, conocidos
como subrboles.
Informacin
Cuando hay 0 nodos
Referencias
se dice que el rbol
esta vaco.
subrbol

subrbol

subrbol
N

rboles Generales

Raz
Padre de 8, 9 y 10

Hijo de 2
5
11

3
6

12

4
8

10
13

14

15
Hojas

Hermanos

rboles Generales

El largo del camino entre un nodo a otro es el


nmero de referencias que componen el camino.
Existe un nico camino desde la raz hasta cualquier
otro nodo del rbol.
1
2

Ancestro de 10

3
6

4
8

10

11

12
15

13
Descendiente de 1 y 4

14

rboles Generales

La profundidad de un nodo es el largo del camino


entre la raz del rbol y el nodo.
La altura de un nodo es el mximo largo de camino
desde ese nodo hasta alguna hoja.
1
2

Profundidad
del rbol = 4

1
3

4
8

10

11

Altura de 4 = 2

12
4

15

13

14

Representacin

Como no se sabe de antemano cuantos hijos tiene un


nodo en particular se utilizan dos referencias, una a
su primer hijo y otra a su hermano ms cercano.
Hijo

2
5

11

3
6

12
15

Hermano

4
8

10

13

14

Representacin

La representacin de un rbol general contiene las


dos referencias.
Ejemplo
class NodoArbolGeneral {
Object elemento;
NodoArbolGeneral hijo;
NodoArbolGeneral hermano;
}

Si se permite que la raz del rbol tenga hermanos, lo que se conoce


como bosque

rboles Binarios

Un rbol binario es un rbol en donde cada nodo


posee 2 referencias a subrboles.

Informacin
Izq

Der

subrbol

subrbol

izquierdo

derecho

rboles Binarios: Propiedades

Los nodos en s que conforman un rbol binario se


denominan nodos internos.
Nodo interno

Nodo externo

Nmero nodos externos = nmero nodos internos + 1

rboles Binarios: Propiedades

Largo camino entre 1 y 2 = 2

Largo camino entre 1 y X = 3


2

1
3

4
3

(largo caminos raz-interno)


=
(largo caminos raz-externo) + 2* nmero nodos internos

Representacin

Al conocer la cantidad de hijos, se representan


directamente.

Ejemplo
class NodoArbolBinario
{
Object elemento;
NodoArbolBinario izq;
NodoArbolBinario der;
}

rboles Binarios: Recorridos

Preorden: raz - subrbol izquierdo - subrbol derecho.


1
2

1245367

Ejemplo
static String preorden(NodoArbolBinario r){
if(r==null) return "";
return r.elemento + preorden(r.izq) + preorden(r.der);
}

rboles Binarios: Recorridos

Inorden: subrbol izquierdo - raz - subrbol derecho.


1
2

4251637

Ejemplo
static String inorden(NodoArbolBinario r){
if(r==null) return "";
return inorden(r.izq) + r.elemento + inorden(r.der);
}

rboles Binarios: Recorridos

Postorden: subrbol izquierdo - subrbol derecho - raz.


1
2

4526731

Ejemplo
static String postorden(NodoArbolBinario r){
if(r==null) return "";
return postorden(r.izq) + postorden(r.der) + r.elemento;
}

rboles de expresiones matemticas

Un rbol de expresiones es un rbol binario que


contiene:
Hojas: corresponden a los operandos de la expresin (variables
o constantes)
Nodos: se encuentran los operadores
*
+

rboles de expresiones matemticas

Si la raz resulta ser operador se retorna el valor al


operar los valores obtenidos de las evaluaciones
recursivas de los subrboles con el operador
respectivo.
*
+

1+2

4-3

Preorden y Pilas

*
+
1

3
*
+
1

*+1243

2
4
3

Como sacarlos
para calcular?
Notacin polaca!

Algoritmos y Estructuras de Datos


ACI600
Escuela de Ingeniera

Unidad VI: Estructuras de datos NO lineales


Clase 14: rboles de bsqueda binaria

MATERIAL PROPIEDAD DE UDLA.


AUTORIZADA SU UTILIZACIN SLO PARA FINES ACADMICOS.

Definicin

Un rbol de bsqueda binaria (ABB) es un rbol


binario en el cual todos los valores del subrbol
izquierdo son menores a un nodo padre y todos los
valores del subrbol derecho son mayores.
X
izq

<X

der

>X

Definicin

Los ABB son un TDA Diccionario que permite realizar


de manera eficiente las operaciones.
raz

<X

Llave

Valor

Izq

Der

>X

Aplicaciones

Implementacin de TDA Diccionario.


Localizacin de elementos en base de datos
relacionales con ndices.
Analizadores lxicos,
sintcticos y semnticos
en compiladores.

Existe una variacin de los ABB llamado rbol AVL que, mediante el
balanceo del rbol, mejora el peor caso de las operaciones de un ABB
de O(n) a O(log n).

Representacin

La definicin de nodo considera la estructura


llave/valor de un TDA Diccionario.
Ejemplo
class Nodo{
public Comparable palabra;
public Object significado;
public Nodo izq, der;
public Nodo(
Comparable x,Object y,Nodo z,Nodo w){
palabra=x; significado=y; izq=z; der=w;
}
}
class Diccionario
{
protected Nodo raiz;
public Diccionario(){
raiz=null;
}

Bsqueda

Si el valor es menor que el elemento en la raz se


busca recursivamente en el subrbol izquierdo, si el
valor es mayor que el elemento en la raz se sigue
buscando recursivamente en el subrbol derecho.
12?

5
12>5

16
12<16

10

20

12>10

12
encontrado

Bsqueda

La funcin retorna la referencia al nodo.


Existe la posibilidad que el valor no sea encontrado.

Ejemplo
public Object buscar(Comparable x){
Nodo r=referencia(x,raiz);
return r==null ? null : r.significado;
}

Bsqueda

La funcin referencia realizar la comparacin en s.


Ejemplo
//bsqueda iterativa en un ABB
protected Nodo referencia(Comparable x,Nodo r){
while(r!=null){
int c=x.compareTo(r.palabra);
if(c==0) return r;
r = c<0 ? r.izq : r.der;
}
return null;
}
//bsqueda recursiva en un ABB
protected Nodo referencia(Comparable x,Nodo r){
if(r==null) return null;
int c=x.compareTo(r.palabra);
if(c==0) return r;
return referencia(x, c<0 ? r.izq : r.der);
}

Bsqueda

El costo promedio de bsqueda es O(log n)


Peor caso O(n)
12?

5
12>5

16
12<16

10
12>10

12
encontrado

Bsqueda y cambio

La misma funcin que encuentra la referencia al


nodo puede utilizarse para cambiar un valor del ABB.
El cambio de valor tiene O(log n)
Ejemplo
public boolean cambiar(Comparable x,Object y){
Nodo r=referencia(x,raiz);
if(r==null) return false;
r.significado = y;
return true;
}

Insercin

Para agregar un elemento al ABB, se debe realizar


una bsqueda infructuosa.
Insertar elemento en el lugar de referencia de
bsqueda.
6?

5
6>5

16
6<16

10

20

6<10

7
6<7

12

Insercin

El orden de insercin es O(log n)


Ejemplo
public boolean agregar(Comparable x,Object y) throws DiccLleno{
if(referencia(x,raiz)!=null)
return false;
raiz=agregar(x,y,raiz);
return true;
}
protected Nodo agregar (Comparable x,Object y,Nodo r) throws
DiccLleno{
if(r==null)
return new Nodo(x,y,null,null);
if(x.compareTo(r.palabra) < 0)
r.izq=agregar(x,y,r.izq);
else
r.der=agregar(x,y,r.der);
return r;
}

Eliminacin

Para eliminar un elemento al ABB, se debe realizar


una bsqueda exitosa del valor en un nodo.
Existen 3 casos:
Si el nodo no tiene hijos se puede eliminar.
Eliminar 7

5
7>5

16
7<16

10

20

7<10

12

Eliminacin

Si el nodo tiene un solo hijo, se cambia la referencia del


padre para que referencia al hijo.

Eliminar 10

10>5

16

16

10<16

10

20
12

12

20

Eliminacin

Si el nodo tiene dos hijos:


Se elimina el nodo con menor valor del subrbol derecho del nodo
Se reemplaza el valor de dicho nodo por el del nodo que se quera
eliminar.
Eliminar 16

16>5

3
1

16
4

10

3
20

17

1
22

17
4

10

20
22

Eliminacin

El algoritmo toma O(log n) en eliminar un nodo.


Ejemplo
public boolean borrar(Comparable x){
Nodo r=referencia(x, raiz);
if(r==null) return false;
raiz=borrar(x,raiz);
return true;
}
//devolver ABB sin x
protected Nodo borrar(Comparable x,Nodo r){
if(r==null) return null;
int c=x.compareTo(r.palabra);
if(c==0) return borrar(r);//borra x
if(c<0)
r.izq=borrar(x,r.izq);
else
r.der=borrar(x,r.der);
return r;
}
//continua ->

Eliminacin

Ejemplo
protected Nodo borrar(Nodo r){
if(r.izq==null) return r.der;
if(r.der==null) return r.izq;
//reemplazar por mayor de arbol izq
if(r.izq.der==null){
r.palabra = r.izq.palabra;
r.significado = r.izq.significado;
r.izq = r.izq.izq; //enlazar hijos menores
}
else{
Nodo rAnt=r.izq;
while(rAnt.der.der!=null)
rAnt=rAnt.der;
r.palabra = rAnt.der.palabra;
r.significado = rAnt.der.significado;
rAnt.der = rAnt.der.izq;//enlazar menores

}
return r;
}

You might also like