Arboles binarios, colas, filas

download Arboles binarios, colas, filas

of 95

description

Estructura de computadores

Transcript of Arboles binarios, colas, filas

  • 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