Professional Documents
Culture Documents
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
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
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
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
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
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
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
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
ESE Informtica
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
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
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
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
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 }
Departamento de informtica
10
Reyes Pavn
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
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; } }
Departamento de informtica
12
Reyes Pavn
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
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; } }
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
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:
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
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
ESE Informtica
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
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
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