Upload
raul
View
34
Download
1
Embed Size (px)
DESCRIPTION
Estructura de computadores
Citation preview
Algoritmos y Estructuras de Datos
ACI600
Escuela de Ingeniera
Unidad V: Tipos de datos abstractosClase 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.
Nulo
Informacin2 Informacin3
siguiente
lista
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 1 k-1 k k+1 n-2 n-1
arreglo[n] =
x
mover cada valor
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.
TDA
Necesito administrar la cola del banco
Entra alguien a la colaSale 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.
a d(a)
Dominio Imagen
Diccionario d
llave 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)
TDA Diccionario
Necesito un directorio de personas
Busca elementosInserta elementosElimina 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
Juan Perez
Jos Gonzlez
Ingreso a 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 Perez1 Juan Perez
Ingreso a RUT 1 Fono 123456781 Juan Perez 12345678
TDA Diccionario: Implementacin
Para la implementacin se utilizar un objeto del tipo llave/valor.
interface Comparable{
int compareTo(Object x);
}
class Registro{
public Comparable palabra;
public Object significado;
public Registro(Object x,Object y){
palabra=x; significado=y;
}
}
Ejemplo
TDA Diccionario: Implementacin
El diccionario debe facilitar la bsqueda, por lo que debe ser eficiente en encontrar las llaves.
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
TDA Diccionario: Implementacin
La funcin ndice encuentra el valor a travs de bqueda binaria O(log n) .
protected int indice(Comparable x){
//repetir mientras queden elementos
int ip=0,iu=n-1;
while(ip
TDA Diccionario: Implementacin
Al utilizar un arreglo en el ejemplo se debe realizar la funcin borrar en O(n).
public boolean borrar(Comparable x)
{
//buscar palabra: O(log2n)
int i=indice(x);
if(i
TDA Diccionario: Implementacin
El mismo caso anterior para la funcin agregar.
El diccionario realiza en menor tiempo la bsqueda.
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)
Algoritmos y Estructuras de Datos
ACI600
Escuela de Ingeniera
Unidad V: Tipos de datos abstractosClase 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.
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;
}
Ejemplo
Representacin
Se soluciona el inconveniente de perder referencia al primer elemento al eliminar/agregar elementos con una referencia fija al primer elemento llamado primero.
Nulo
valor1 valor2 valor3
sgte sgte
lista
sgte
primero
Operaciones
La funcin buscar recorre la lista hasta encontrar el elemento.
Realiza la operacin en O(n).
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;
}
Ejemplo
Operaciones
La bsqueda por ndice recorre la lista enlazada x veces.
La operacin demora O(n).
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;
}
Ejemplo
Operaciones
Para eliminar un nodo, se ubica y luego se elimina su referencia.
Nulo
valor1 valor i-1 valor i
r r
primero
sgte sgtesgte .
ndice i con valor x
valor i+1
Operaciones
La operacin demora O(n).
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;
}
}
Ejemplo
Operaciones
En la insercin se crea el nodo en la posicin i.
Nulo
Informacin 1 Informacin i-1 Informacin i
r r
Informacin i
primero
sgte sgte
sgte sgte
sgte .
ndice i-1 ndice nuevo i+1
Operaciones
Se debe recorrer el listado con un tiempo de O(n).
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;
}
}
}
Ejemplo
Eliminacin de recursividad
Cuando el llamado recursivo se realiza al final de una funcin (tail recursion), la recursin se puede eliminar utilizando un ciclo.
void imprimir(int[] a, int j) // versin recursiva {
if (j
Eliminacin de recursividad
Cuando el llamado recursivo se realiza en medio de una funcin, la recursin se puede eliminar utilizando una pila.
static void inverso( NodoLista n ) //version recursiva
{
if( n!=null )
{
inverso(n.siguiente);
System.out.print(n.elemento+"->");
}
}
Ejemplo
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.
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+"->");
}
}
Ejemplo
Algoritmos y Estructuras de Datos
ACI600
Escuela de Ingeniera
Unidad V: Tipos de datos abstractosClase 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
tope() o top: retorna el
elemento que se encuentre
en el tope de la pila
estaVacia() o isEmpty: retorna
verdadero si la pila no
contiene elementos 5
3
9
4
1
apilar desapilar
tope
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.
Undo1
Undo2
Redo1
Redo2
Redo3
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.
a0
0
a1
1
a n-2
n-2
a n-1
n-1
arreglo[n] =
a*
apilar
arreglo = arreglo2[2*n] = a0
0
a1
1
a n-2
n-2
a n-1
n-1
a*
n 2*n-2
2*n-1
Representacin
En la implementacin con nodos, el primer elemento es el tope de la pila.
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;
}
Ejemplo
Operaciones
Para apilar se debe agregar un nuevo primer elemento.
Para desapilar simplemente se elimina el primer elemento.
Nulo
valor nuevo valor1 valor2
sgte sgte
lista
sgte
lista
Nulo
valor2 valor3
sgte
lista
sgte
valor1
sgte
lista
Operaciones
Ambas operaciones son O(1).
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;
}
}
Ejemplo
Operaciones
Las funciones tope y estaVacia tambin son O(1).
public Object tope() {
if (!estaVacia()) // si esta vacia es un error
{
Object x=lista.elemento;
return x;
}
}
public boolean estaVacia()
{
return lista==null;
}
}
Ejemplo
Algoritmos y Estructuras de Datos
ACI600
Escuela de Ingeniera
Unidad V: Tipos de datos abstractosClase 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
8 7 6 5 4 3 2 1encolar 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.
0
34
1
3
k-1
2
k k+1 n-2 n-1
cola=
primero ltimo
numElem
Implementacin arreglo
El caso ms general es utilizando arreglo circular.
El arreglo circular funciona igual que un lista circular, pero sin referencias.
15
0
10
1
3
k-1
2
k k+1
34
n-2
22
n-1
cola=
primeroltimo
numElem2 numElem1
numElem = numElem1 + numElem2
Representacin
Al utilizar arreglo se inicializa el nmero mximo de datos a utilizar.
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;
}
Ejemplo
Operaciones
Al agregar un elemento se verifica que no est lleno el arreglo.
La operacin demora O(1).
public void encolar(Object x) {
if (numElem
Operaciones
Al eliminar un elemento se verifica que no est vaco el arreglo.
Las operaciones demoran O(1).
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;
}
}
Ejemplo
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.
6
0
4
1
3
3
2
4
5
5 6
9
7
7
82
prioridades 8 1
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))
1
2 3
4 5 6 7
8 9
Algoritmos y Estructuras de Datos
ACI600
Escuela de Ingeniera
Unidad VI: Estructuras de datos NO linealesClase 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.
Cuando hay 0 nodos
se dice que el rbol
esta vaco.
Informacin
Referencias
subrbol1
subrbolN
subrbol2
rboles Generales
1
2 4
5 6 8 9
11 12
3
7 10
15
13 14
Hojas
Raz
Hermanos
Padre de 8, 9 y 10
Hijo de 2
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 4
5 6 8 9
11 12
3
7 10
15
13 14
2
3
1 Ancestro de 10
Descendiente de 1 y 4
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 4
5 6 8 9
11 12
3
7 10
15
13 14
2
3
4
1
Profundidad del rbol = 4
1
2 Altura de 4 = 2
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.
1
2 3 4
5 6 7 8 9 10
11 12
15
13 14
Hijo
Hermano
Representacin
La representacin de un rbol general contiene las dos referencias.
class NodoArbolGeneral {
Object elemento;
NodoArbolGeneral hijo;
NodoArbolGeneral hermano;
}
Ejemplo
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
subrbolizquierdo
subrbolderecho
Der
rboles Binarios: Propiedades
Los nodos en s que conforman un rbol binario se denominan nodos internos.
1
2 3
4
Nodo interno
Nodo externo
Nmero nodos externos = nmero nodos internos + 1
rboles Binarios: Propiedades
1
2 3
4
X
(largo caminos raz-interno)=
(largo caminos raz-externo) + 2* nmero nodos internos
1
2
3
Largo camino entre 1 y 2 = 2
Largo camino entre 1 y X = 3
Representacin
Al conocer la cantidad de hijos, se representan directamente.
class NodoArbolBinario
{
Object elemento;
NodoArbolBinario izq;
NodoArbolBinario der;
}
Ejemplo
rboles Binarios: Recorridos
Preorden: raz - subrbol izquierdo - subrbol derecho.
1
2 3
4 5 6 7
1 2 4 5 3 6 7
static String preorden(NodoArbolBinario r){
if(r==null) return "";
return r.elemento + preorden(r.izq) + preorden(r.der);
}
Ejemplo
rboles Binarios: Recorridos
Inorden: subrbol izquierdo - raz - subrbol derecho.
4 2 5 1 6 3 7
1
2 3
4 5 6 7
static String inorden(NodoArbolBinario r){
if(r==null) return "";
return inorden(r.izq) + r.elemento + inorden(r.der);
}
Ejemplo
rboles Binarios: Recorridos
Postorden: subrbol izquierdo - subrbol derecho - raz.
4 5 2 6 7 3 1
1
2 3
4 5 6 7
static String postorden(NodoArbolBinario r){
if(r==null) return "";
return postorden(r.izq) + postorden(r.der) + r.elemento;
}
Ejemplo
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
*
+ -
1 2 4 3
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
1 + 2 4 - 3
Preorden y Pilas
*
+ -
1 2 4 3
* + 1 2 4 3
3
4
-
2
1
+
* Como sacarlospara calcular?
Notacin polaca!
Algoritmos y Estructuras de Datos
ACI600
Escuela de Ingeniera
Unidad VI: Estructuras de datos NO linealesClase 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
X
izq der
Definicin
Los ABB son un TDA Diccionario que permite realizar de manera eficiente las operaciones.
X
Llave ValorIzq Der
raz
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.
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;
}
Ejemplo
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.
5
3 16
1 4 10 20
7 12
12?
12>5
1210
encontrado
Bsqueda
La funcin retorna la referencia al nodo.
Existe la posibilidad que el valor no sea encontrado.
public Object buscar(Comparable x){
Nodo r=referencia(x,raiz);
return r==null ? null : r.significado;
}
Ejemplo
Bsqueda
La funcin referencia realizar la comparacin en s.
//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
Bsqueda
El costo promedio de bsqueda es O(log n)
Peor caso O(n)
5
16
10
12
12?
12>5
1210
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)
public boolean cambiar(Comparable x,Object y){
Nodo r=referencia(x,raiz);
if(r==null) return false;
r.significado = y;
return true;
}
Ejemplo
Insercin
Para agregar un elemento al ABB, se debe realizar una bsqueda infructuosa.
Insertar elemento en el lugar de referencia de bsqueda.
5
3 16
1 4 10 20
7 12
6?
6>5
6
Insercin
El orden de insercin es O(log n)
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;
}
Ejemplo
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.
5
3 16
1 4 10 20
7 12
Eliminar 7
7>5
7
Eliminacin
Si el nodo tiene un solo hijo, se cambia la referencia del padre para que referencia al hijo.
5
3 16
1 4 10 20
12
Eliminar 10
10>5
10
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.
5
3 16
1 4 10 20
22
Eliminar 16
16>5
17
5
3 17
1 4 10 20
22
Eliminacin
El algoritmo toma O(log n) en eliminar un nodo.
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
Ejemplo
Eliminacin
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;
}
Ejemplo