You are on page 1of 19

Ampliacin de estructura de datos y de la informacin

ESE Informtica

TEMA 3. rboles
Objetivos
En este tema se estudia una de las estructuras de datos no lineal ms importante en computacin, el rbol. Comenzaremos introduciendo la terminologa asociada a los rboles y continuaremos con definiciones de varios tipos de rboles y sus aplicaciones. Para cada tipo de rbol presentaremos su especificacin e implementacin, as como los principales algoritmos de manipulacin.

Contenidos
1. Introduccin 2. Terminologa fundamental
2.1. Recorridos de un rbol

3. rboles binarios
3.1. Definicin 3.2. Especificacin 3.3. Implementacin

4. rboles binarios de bsqueda


4.1. Definicin 4.2. Especificacin 4.3. Implementacin

5. rboles binarios equilibrados


5.1. rboles AVL

6. rboles generales
6.1. Especificacin 6.2. Implementacin

Bibliografa
Bsica
Lewis J. y Chase J.; Estructuras de datos con Java. Diseo de estructuras y algoritmos.
Departamento de informtica 1 Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

Segunda Edicin. Pearson Addisson Wesley 2006. Pags. 404-411, 416-420 Weiss, Mark Allen; Estructuras de datos en Java: compatible con JAVA 2, Addisson Wesley. 2000. Pgs. 147-153, 435-461, 467-476, 484-505, 512-518, 553-568 Rowe, Glen; An Introduction to Data Structures and Algorithms with Java, Prentice Hall,1998. Pgs. 282-331

Complementaria
Lewis, J. y Chase J. Estructuras de datos con Java. Diseo de estructuras y algoritmos. 2 ed. Pearson. Addisson Wesley. 2006 Pgs. 310-326, 340-348, 351-354. Goodrich M. y Tamassia R., Data structures and Algorithms in JAVA 4 ed. John Wiley & Sons Inc. , 2006 Pgs.266-281, 282-304, 320-328, 334-351, 418-439. Weiss, Mark Allen, Estructuras de datos en Java: compatible con JAVA 2, Addisson Wesley. 2000. Pgs. 477-484, 505-512.

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

Tema 3. rboles
1. Introduccin
rbol: estructura no lineal y dinmica de datos ms importante en computacin

Dinmica: puede cambiar durante la ejecucin de un programa No lineal: a cada elemento del rbol pueden seguirle varios elementos

2. Terminologa fundamental
rbol: estructura jerrquica de una coleccin de objetos

Coleccin de elementos llamados nodos, uno de los cuales se distingue como raz, Una relacin (de "paternidad") que impone una estructura jerrquica sobre los nodos

Ejs. de rboles: rboles genealgicos, organigramas Formalmente, un rbol se puede definir de manera recursiva como:

Una forma particular de rbol es el rbol nulo o vaco, que es un rbol sin nodos Un solo nodo es, por s mismo, un rbol Ese nodo es tambin la raz de dicho rbol

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

Supngase que n es un nodo y que A1, A2,.., AK son rboles con races n1, n2,.., nK, respectivamente. Se puede construir un nuevo rbol haciendo que n se constituya en el padre de los nodos n1, n2,.., nK rboles hijos) de la raz

n es la raz y A1, A2,.., AK son los subrboles (o

Los nodos n1, n2,.., nK reciben el nombre de hijos del nodo n y el nodo n recibe el nombre de padre de dichos nodos

Grficamente la estructura rbol se suele representar mediante un grafo jerrquico


A

Hermanos: nodos hijos del mismo padre Ej: B,C,D y E son hermanos Camino del nodo n1 al nodo nK: sucesin de nodos de un rbol n1, n2,.., nK, tal que ni es el padre de ni+1, i = 1, 2, .., K-1 Ej: A, E, J, K es un camino

Longitud de un camino: nmero de nodos del camino menos 1. Caminos de longitud cero: aquellos que van de cualquier nodo a l mismo Ej: el camino A, E, J, K tiene longitud 3 Si existe un camino de un nodo n a otro m, entonces n es un antecesor de m, y m es un descendiente de n En un rbol, la raz es el nico nodo que no tiene antecesores

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

Hoja o nodo terminal: nodo sin descendientes Subrbol de un rbol: nodo junto con todos sus descendientes Grado de un nodo: nmero de subrboles que tiene. Los nodos terminales u hojas tienen grado 0 Ej: el grado de A es 4. Altura de un nodo: longitud del camino ms largo de ese nodo a una hoja. La altura del rbol es la altura de la raz Ej: B tiene altura 1, E altura 2 y H altura 0. La altura del rbol es 3 Nivel o profundidad de un nodo: longitud del nico camino desde la raz a ese nodo. Por definicin, la raz tiene nivel 0. La profundidad de un rbol se define como el mximo de los niveles de los nodos del rbol Ej: B tiene nivel 1, H nivel 2. La profundidad del rbol es 3

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

2.1. Recorridos de un rbol


Estrategias para recorrer un rbol y procesar sus nodos:

Recorridos en profundidad Recorridos en anchura

Recorridos en profundidad Tres formas de recorrer un rbol en profundidad:


Preorden u orden previo Inorden u orden simtrico Postorden u orden posterior

Definicin recursiva:

Si el rbol A es nulo la lista vaca es el listado de los nodos del rbol A en los rdenes preorden, inorden y postorden Si el rbol A tiene un solo nodo ese nodo constituye el listado del rbol A en los tres rdenes Si el rbol A tiene ms de un nodo, es decir, tiene como raz el nodo n y los subrboles A1, A2,.., AK:

A1

A2

Ak

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

Listado en preorden de A: raz del rbol A, seguida de los nodos del rbol A1 en preorden, luego por los nodos de A2 en preorden y as sucesivamente hasta los nodos de AK en preorden Ej: A, B, F, G, C, D, H, E, I, J, K Listado en inorden de A: nodos del rbol A1 en inorden, seguidos de la raz n y luego por los nodos de A2,.., AK en inorden Ej: F, B, G, A, C, H, D, I, E, K, J Listado en postorden de A: nodos del rbol A1 en postorden, luego los nodos de A2 en postorden y as sucesivamente hasta los nodos de AK en postorden y por ltimo la raz n Ej: F, G, B, C, H, D, I, K, J, E, A Recorrido en anchura Exploracin del rbol por niveles, listando los nodos de izquierda a derecha y empezando por el nivel 0, luego el nivel 1, ... Ej: A, B, C, D, E, F, G, H, I, J, K

3. rboles binarios
3.1. Definicin
rbol binario: un rbol donde cada nodo tiene como mximo grado 2 un rbol binario es

Un rbol vaco, o Un rbol en que sus nodos tienen un hijo izquierdo y un hijo derecho. Cada uno de estos hijos es a su vez un rbol binario

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

Se distinguen los hijos de un nodo como izquierdo y derecho Ej: rboles binarios distintos

Recorridos:

Preorden: raz, recorrido en preorden del subrbol izquierdo y recorrido en preorden del subrbol derecho Ejs: 1, 2, 3, 5, 4 (coincide en los dos rboles) Postorden: recorrido en postorden del subrbol izquierdo, recorrido en postorden del subrbol derecho y raz Ejs: 5, 3, 4, 2, 1 (coincide en los dos rboles) Inorden: recorrido en inorden del subrbol izquierdo, raz y recorrido en inorden del subrbol derecho Ejs: 3, 5, 2, 4, 1 1, 5, 3, 2, 4 Anchura: recorrido por niveles Ejs: 1, 2, 3, 4, 5 (coincide en los dos rboles)

3.2. Especificacin
Especificacin cuasi-formal del TAD rbol binario

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

public class ArbolBinario<E> { // Declaracin de tipos: ArbolBinario // Caractersticas: // Un rbol binario es un rbol vaco o un nodo con dos hijos (izquierdo // y derecho) que a su vez son rboles binarios // Los objetos son modificables // Constructores public ArbolBinario(); // Produce: Un rbol vaco public ArbolBinario(E elemRaiz, ArbolBinario<E> hi, ArbolBinario<E> hd) throws NullPointerException; // Produce: Si hi o hd son null, lanza la excepcin // NullPointerException. // En caso contrario, construye un rbol de raz elemRaiz, // hijo izquierdo hi e hijo derecho hd // Mtodos public boolean esVacio(); // Produce: Cierto si this est vaco. Falso en caso contrario. public E raiz() throws ArbolVacioExcepcion; // Produce: Si this est vaco lanza la excepcin // ArbolVacioExcepcion, // sino devuelve el objeto almacenado en la raz public ArbolBinario<E> hijoIzq() throws ArbolVacioExcepcion; // Produce: Si this est vaco lanza la excepcin // ArbolVacioExcepcion, // sino devuelve el subrbol izquierdo public ArbolBinario<E> hijoDer() throws ArbolVacioExcepcion; // Produce: Si this est vaco lanza la excepcin // ArbolVacioExcepcion, // sino devuelve el subrbol derecho public boolean esta (E elemento); // Produce: Cierto si elemento est en this, // falso, en caso contrario public void setRaiz(E elemRaiz) throws ArbolVacioExcepcion; // Modifica: this // Produce: Si this est vaco lanza la excepcin // ArbolVacioExcepcion, // sino asigna el objeto elemRaz a la raz del rbol this public void setHijoIzq(ArbolBinario<E> hi) throws ArbolVacioExcepcion, NullPointerException; // Modifica: this

Departamento de informtica

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

// Produce: // // //

Si hi es null, lanza la excepcin NullPointerException. En caso contrario, si this est vaco lanza la excepcin ArbolVacioExcepcion, sino asigna el rbol hi como subrbol izquierdo de this

public void setHijoDer(ArbolBinario<E> hd) throws ArbolVacioExcepcion, NullPointerException; // Modifica: this // Produce: Si hd es null, lanza la excepcin NullPointerException. // En caso contrario, si this est vaco lanza la excepcin // ArbolVacioExcepcion, // sino asigna el rbol hd como subrbol derecho de this public void suprimir (); // Modifica: this // Produce: El rbol binario vaco }

Ejemplo de uso del TAD rbol binario


public static <E> void preorden(ArbolBinario<E> a) { if (!a.esVacio()) { System.out.print(a.raiz() + " "); preorden(a.hijoIzq()); preorden(a.hijoDer()); } } public static <E> void anchura(ArbolBinario<E> a){ Cola<ArbolBinario<E>> c = new EnlazadaCola<E>(); c.insertar(a); do { a = c.suprimir(); if (!a.esVacio()){ System.out.print(a.raiz() + " "); c.insertar(a.hijoIzq()); c.insertar(a.hijoDer()); } } while (!c.esVacio()); }

Departamento de informtica

10

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

3.3. Implementacin
Definicin de una interfaz que describa los nombres de los mtodos que soporta el TAD y cmo tienen que ser declarados y usados
public interface ArbolBinario<E> { public boolean esVacio(); public E raiz() throws ArbolVacioExcepcion; public ArbolBinario<E> hijoIzq() throws ArbolVacioExcepcion ; public ArbolBinario<E> hijoDer() throws ArbolVacioExcepcion; public boolean esta (E elemento); public void setRaiz(E elemRaiz) throws ArbolVacioExcepcion; public void setHijoIzq(ArbolBinario<E> hi) throws ArbolVacioExcepcion, NullPointerException; public void setHijoDer(ArbolBinario<E> hd) throws ArbolVacioExcepcion, NullPointerException; public void suprimir(); }

Para poder realizar una implementacin mediante nodos enlazados es necesario definir una clase NodoBinario<E>
public class NodoBinario<E>{ private E elemento; // referencia al elemento del nodo private NodoBinario<E> izq; // referencia al nodo izquierdo private NodoBinario<E> der; // referencia al nodo derecho public NodoBinario(E e, NodoBinario<E> hi, NodoBinario<E> hd) // Produce: Un nodo con valores e, hi y hd en sus atributos // elemento, izq y der, respectivamente { elemento = e; izq = hi; der = hd; } // mtodos public E getElemento() // Produce: Devuelve el atributo elemento de this { return elemento; } public NodoBinario<E> getIzq() // Produce: Devuelve el atributo izq de this { return izq; }

Departamento de informtica

11

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

public NodoBinario<E> getDer() // Produce: Devuelve el atributo der de this { return der; } public void setElemento(E e) // Modifica: this // Produce: Modifica el atributo elemento de this { elemento = e; } public void setIzq(NodoBinario<E> hi) // Modifica: this // Produce: Modifica el atributo izq de this { izq = hi; } public void setDer(NodoBinario<E> hd) // Modifica: this // Produce: Modifica el atributo der de this { der = hd; } }

Implementacin de la interfaz ArbolBinario<E> usando la clase


NodoBinario<E> public class EnlazadoArbolBinario<E> implements ArbolBinario<E> { private NodoBinario<E> nodoRaiz; // constructores public EnlazadoArbolBinario() { nodoRaiz = null; } public EnlazadoArbolBinario(E elemRaiz, ArbolBinario<E> hi, ArbolBinario<E> hd) throws NullPointerException { if (hi==null || hd ==null) throw new NullPointerException(); nodoRaiz = new NodoBinario<E>(elemRaiz, ((EnlazadoArbolBinario<E>) hi).nodoRaiz, ((EnlazadoArbolBinario<E>) hd).r); }

Departamento de informtica

12

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

private EnlazadoArbolBinario<E>(NodoBinario<E> raiz) { nodoRaiz = raiz; } // mtodos public boolean esVacio() { return nodoRaiz == null; } public E raiz() throws ArbolVacioExcepcion { if (esVacio()) throw new ArbolVacioExcepcion("raiz: rbol vaco"); return nodoRaiz.getElemento(); } public ArbolBinario<E> hijoIzq() throws ArbolVacioExcepcion { if (esVacio()) throw new ArbolVacioExcepcion("hijoIzq: rbol vaco"); return new EnlazadoArbolBinario<E>(nodoRaiz.getIzq()); } public ArbolBinario<E> hijoDer() throws ArbolVacioExcepcion { if (esVacio()) throw new ArbolVacioExcepcion("hijoDer: rbol vaco"); return new EnlazadoArbolBinario<E>(nodoRaiz.getDer()); } public boolean esta(E elemento) { return esta(nodoRaiz,elemento); } private boolean esta(NodoBinario<E> raiz, E elemento) { if (raiz==null) return false; if (raiz.getElemento().equals(elemento)) return true; boolean temp = esta(raiz.getIzq(),elemento); if (!temp) return esta(raiz.getDer(),elemento); return temp; }

Departamento de informtica

13

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

public void setRaiz(E elemRaiz) throws ArbolVacioExcepcion { if (esVacio()) throw new ArbolVacioExcepcion("raiz: rbol vaco"); nodoRaiz.setElemento(elemRaiz); } public void setHijoIzq(ArbolBinario<E> hi) throws ArbolVacioExcepcion, NullPointerException { if (hi==null) throw new NullPointerException(); if (esVacio()) throw new ArbolVacioExcepcion("setHijoIzq: rbol vaco"); nodoRaiz.setIzq(((EnlazadoArbolBinario<E>) hi).nodoRaiz); } public void setHijoDer(ArbolBinario<E> hd) throws ArbolVacioExcepcion, NullPointerException { if (hd==null) throw new NullPointerException(); if (esVacio()) throw new ArbolVacioExcepcion("setHijoIzq: rbol vaco"); nodoRaiz.setDer(((EnlazadoArbolBinario<E>) hd).nodoRaiz); } public void suprimir() { nodoRaiz = null; } }

4. rboles binarios de bsqueda


4.1. Definicin
Estructura de datos bsica para almacenar elementos que estn clasificados siguiendo algn orden lineal Propiedades:

Para todo nodo A del rbol, Todos los valores de los nodos del subrbol izquierdo de A deben ser menores al valor del nodo A, y

Departamento de informtica

14

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

Todos los valores de los nodos del subrbol derecho de A deben ser mayores o iguales al valor del nodo A

Un recorrido en inorden del rbol proporciona una lista en orden ascendente de los valores almacenados en los nodos

Operaciones:

Bsqueda: determinar si x est en el rbol


Si x = r localizado Si x < r buscar en el subrbol izquierdo Si x r buscar en el subrbol derecho Proceso anlogo a una bsqueda binaria en un array

Insercin: aadir un nuevo elemento x al rbol


1. Avanzar en el rbol comparando x con r 2. Repetir el paso 1 hasta que el subrbol donde deba insertarse sea el rbol vaco 3. Insertar el elemento

Eliminacin: borrar un elemento x del rbol


1. Si x es hoja se suprime x 2. Si el elemento a borrar tiene un solo descendiente se sustituye por ese descendiente 3. Si el elemento a borrar tiene los dos descendientes se sustituye por el menor elemento del subrbol derecho. Despus se elimina el nodo correspondiente a dicho elemento

4.2. Especificacin
Especificacin cuasi-formal
public class ArbolBusqueda<E> { // Declaracin de tipos: ArbolBusqueda // Caractersticas: // Es un rbol binario donde para cada nodo se cumple la propiedad de // que todos los nodos con clave menor que la suya estn en su

Departamento de informtica

15

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

// // //

subrbol izquierdo y todos los nodos con clave mayor o igual se encuentran en el subrbol derecho. Los objetos son modificables

// Constructores public ArbolBusqueda(); // Produce: Un rbol vaco // Mtodos public boolean esVacio(); // Produce: Cierto si el rbol est vaco. Falso en caso contrario. public E raiz() throws ArbolVacioExcepcion; // Produce: Si el rbol est vaco lanza la excepcin // ArbolVacioExcepcion, // sino devuelve el objeto almacenado en la raz public ArbolBusqueda<E> hijoIzq() throws ArbolVacioExcepcion; // Produce: Si el rbol est vaco lanza la excepcin // ArbolVacioExcepcion, // sino devuelve el subrbol izquierdo public ArbolBusqueda<E> hijoDer() throws ArbolVacioExcepcion; // Produce: Si el rbol est vaco lanza la excepcin // ArbolVacioExcepcion, // sino devuelve el subrbol derecho public void insertar(E o); // Modifica: this // Produce: Aade el objeto o a this public void eliminar(E o) throws ElementoIncorrecto; // Modifica: this // Produce: Si o no existe en el rbol, lanza la excepcin // ElementoIncorrecto // sino elimina el objeto de this. public boolean buscar(E o) ; // Produce: Devuelve cierto si el objeto est en el rbol // y falso en otro caso

4.3. Implementacin
Cmo comparar los elementos de los nodos?

Solucin: los elementos deben ser instancias de una clase que implemente la interface Comparable<E> existente en java.

Departamento de informtica

16

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

public interface Comparable<E>{ public int compareTo(E e); }

Interfaz Java para el TAD rbol Binario de Bsqueda


public interface ArbolBusqueda <E extends Comparable<E>> { public boolean esVacio(); public E raiz() throws ArbolVacioExcepcion; public ArbolBusqueda<E> hijoIzq() throws ArbolVacioExcepcion; public ArbolBusqueda<E> hijoDer() throws ArbolVacioExcepcion; public void insertar(E elemento); public void eliminar(E elemento) throws ElementoIncorrecto; public boolean buscar(E elemento); }

Escribir una clase concreta que implementa los mtodos de la interfaz asociada con el TAD. Dicha clase hace uso de la clase NodoBinario<E>, definida anteriormente, que contiene una referencia a cada uno de los hijos del nodo adems de una referencia al elemento que contiene.
public class ArbolBinarioBusqueda<E extends Comparable<E>> implements ArbolBusqueda<E> { private NodoBinario<E> raiz; public ArbolBinarioBusqueda(){ raiz=null; } private ArbolBinarioBusqueda(NodoBinario<E> r){ raiz=r; } public boolean esVacio(){ return raiz==null; } public E raiz() throws ArbolVacioExcepcion{ if (esVacio()) throw new ArbolVacioExcepcion("raiz: rbol vaco"); return raiz.getElemento(); } public ArbolBusqueda<E> hijoIzq() throws ArbolVacioExcepcion { if (esVacio()) throw new ArbolVacioExcepcion("hijoIzq: rbol vaco"); return new ArbolBinarioBusqueda<E>(raiz.getIzq()); }
Departamento de informtica 17 Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

public ArbolBusqueda<E> hijoDer() throws ArbolVacioExcepcion { if (esVacio()) throw new ArbolVacioExcepcion("hijoDer: rbol vaco"); return new ArbolBinarioBusqueda<E>(raiz.getDer()); } public void insertar(E elemento){ raiz=insertar(raiz, elemento); } protected NodoBinario<E> insertar(NodoBinario<E> r, E elemento){ if(r==null) return new NodoBinario<E>(elemento,null,null); else if (elemento.compareTo(r.getElemento())<0) r.setIzq(insertar(r.getIzq(),elemento)); else r.setDer(insertar(r.getDer(),elemento)); return r; } public void eliminar(E elemento) throws ElementoIncorrecto{ raiz=eliminar(raiz, elemento); } protected NodoBinario<E> eliminar (NodoBinario<E> r, E elemento) throws ElementoIncorrecto{ if (r==null) throw new ElementoIncorrecto("eliminar: elemento no existe"); else if (elemento.compareTo(r.getElemento())<0) r.setIzq(eliminar(r.getIzq(),elemento)); else if (elemento.compareTo(r.getElemento())>0) r.setDer(eliminar(r.getDer(),elemento)); else if (r.getIzq()!=null && r.getDer()!=null){ r.setElemento(getMasIzq(r.getDer())); r.setDer(eliminarMasIzq(r.getDer())); } else return(r.getIzq()!=null)?r.getIzq():r.getDer(); return r; } protected E getMasIzq(NodoBinario<E> r){ while (r.getIzq()!=null) r=r.getIzq(); return r.getElemento(); } protected NodoBinario<E> eliminarMasIzq(NodoBinario<E> r){ if (r.getIzq()==null) return r.getDer(); else r.setIzq(eliminarMasIzq(r.getIzq())); return r; }

Departamento de informtica

18

Reyes Pavn

Ampliacin de estructura de datos y de la informacin

ESE Informtica

public boolean buscar(E elemento){ return buscar(raiz, elemento); } protected boolean buscar (NodoBinario<E> r, E elemento){ if (r==null) return false; else if (elemento.compareTo(r.getElemento())==0) return true; else if (elemento.compareTo(r.getElemento())<0) return buscar(r.getIzq(),elemento); else return buscar(r.getDer(),elemento); } }

Los mtodos buscar, insertar y eliminar llaman a un mtodo protected que recibe como parmetro la raz del rbol y una referencia al elemento. Los mtodos que desde un punto de vista lgico son privados, tienen como atributo de visibilidad protected, en lugar de private. Esto es debido a que se usarn posteriormente en una clase derivada de ArbolBinarioBusqueda. Los mtodos getMasIzq y eliminarMasIzq se usan cuando se elimina un nodo del rbol binario de bsqueda que tiene dos descendientes. Para simplificar el cdigo se emplea recursin, pero sera posible una implementacin no recursiva.

Departamento de informtica

19

Reyes Pavn

You might also like