Professional Documents
Culture Documents
Objetivos
o Aprender los conceptos bsicos de rboles, rboles binarios y rboles binarios de bsqueda. o Aprender los conceptos de recorridos de rboles y las operaciones bsicas sobre rboles binarios de bsqueda o Conocer los rboles equilibrados.
Bibliografa
o Data structures, algorithms, and applications in Java, Sahni (captulos 12 y 15) o Estructuras de datos en Java, Weiss (captulos 17 y 18) o Data Structures and Algorithms in Java (4th edition), Goodrich y Tamassia (captulo 10)
Contenidos
1. 2. 3. 4. 5.
Conceptos de rboles rboles generales: representacin rboles binarios: definicin y propiedades Recorridos de rboles binarios rboles binarios de bsqueda: representacin y operaciones bsicas 6. La clase ABBMap 7. La clase ABBColaPrioridad 8. rboles equilibrados
3
1. Conceptos de rboles
Tablas de dispersin rboles binarios de bsqueda
Montculos
Map/Diccionario
Cola de prioridad
1. Conceptos de rboles
Modelos lineales vs. jerrquicos
o Las estructuras de datos lineales permiten describir conjuntos de datos que mantienen entre ellos relaciones de sucesin (o de predecesin). Ejemplo: lista de clientes de una empresa, trabajos en la cola de impresin, etc. o Los rboles permiten representar estructuras jerrquicas entre conjuntos de datos. Ejemplo: estructura de directorios, rbol genealgico, expresiones aritmticas, etc.
5
1. Conceptos de rboles
Estructuras jerrquicas
o En ocasiones los datos de una coleccin mantienen relaciones de tipo jerrquico, que no es posible expresar con una representacin lineal. Ejemplo 1: coleccin de directorios para las prcticas de EDA
$HOME
1. Conceptos de rboles
Estructuras jerrquicas *
+ -
*
a b c
d 7
o Los rboles son estructuras bsicas para problemas de bsqueda y optimizacin (ajedrez, damas, sudoku, etc.)
1. Conceptos de rboles
Conceptos bsicos
o Un rbol es una estructura jerrquica que se puede definir por medio de un conjunto de nodos (uno de los cuales es distinguido como la raz del rbol) y un conjunto de aristas tal que: Cualquier nodo H, a excepcin del raz, est conectado por medio de una arista a un nico nodo P. Se dice que P es el nodo padre y H el hijo Un nodo sin hijos se denomina hoja Un nodo que no es hoja se denomina nodo interno El grado de un nodo es el nmero de hijos que tiene
8
Nodo raz: A
1. Conceptos de rboles
Ejemplo
nodo raz
B D E F A
padre hijo
C
N 9
1. Conceptos de rboles
Longitud, profundidad y altura
o En un rbol hay un nico camino desde la raz a cada nodo o El nmero de aristas que componen un camino se denomina longitud del camino o Profundidad de un nodo: longitud del camino que va desde la raz a ese nodo
La profundidad de la raz es 0 Se dice que todos los nodos que estn a la misma profundidad estn en el mismo nivel
o Altura de un nodo: longitud del camino que va desde ese nodo hasta la hoja ms profunda bajo l
o Altura de un rbol = Altura de la raz
10
a) Cuntas aristas tiene un rbol con N nodos? b) Longitud de A a D? c) Longitud de C a K? d) Longitud de B a N? e) Longitud de B a B? f) Profundidad de A, B, C y F? g) Altura de B, C, I, F y del rbol?
1. Conceptos de rboles
Ejercicio 1
A B D E I M N 11 F J C G K H L
1. Conceptos de rboles
Definicin recursiva de rbol
o Un rbol es:
o Un conjunto vaco (sin nodos ni aristas) , o o Un nodo raz y cero o ms subrboles no vacos donde cada una de sus races est conectada mediante una arista con el nodo raz
7 Subrbol con raz 3 3 11 10 2 Nodo raz Subrbol con raz 4
4 1
12
2. rboles generales
Representacin
o Listas (ordenadas) de hijos
13
2. rboles generales
Representacin
de hijos: o Ejemplo: listas ordenadas
raz
14
2. rboles generales
Representacin
o Ejemplo: hijo ms a la izquierda-hermano derecho:
raz raz
raz
15
3. rboles binarios
Definicin y propiedades
El nmero mximo de nodos del nivel i es 2i En un rbol de altura H, el nmero mximo de nodos es: i=0..H2i = 2H+1 1 El nmero mximo de hojas es:
o Un rbol binario es un rbol en el que ningn nodo puede tener ms de dos hijos (hijo izquierdo e hijo derecho) o Propiedades:
A B D G E C F Nivel 0 1 2 3
16
3. rboles binarios
Definicin y propiedades
H = log2N N = 2H+1 1
o Un rbol binario es lleno si tiene todos sus niveles completos o Propiedades: sea H su altura y N su tamao (nmero de nodos)
A B C
17
N=7 H=2
3. rboles binarios
Definicin y propiedades
o Un rbol binario completo tiene todos sus niveles completos, a excepcin quizs del ltimo en el cul todas las hojas estn tan a la izquierda como sea posible o Propiedades: sea H su altura y N su tamao (nmero de nodos)
H log2N es un rbol equilibrado 2H N 2H+1 1
N=4 H=2
Nota: un rbol es equilibrado si los subrboles izquierdo y derecho de cualquier nodo tienen alturas que difieren como mucho en 1 B D
A C
18
4. Operaciones de recorrido
Recorrido en anchura
A B D G E C F
o En un recorrido en anchura (por niveles) de un rbol binario los nodos se visitan nivel a nivel y, dentro de cada nivel, de izquierda a derecha
19
o En profundidad: los nodos se visitan bajando por las ramas del rbol
4. Operaciones de recorrido
Recorridos en profundidad
Pre-Orden: 1) raz, 2) sub-rbol izquierdo, 3) sub-rbol derecho In-Orden: 1) sub-rbol izquierdo, 2) raz, 3) sub-rbol derecho Post-Orden: 1) sub-rbol izquierdo, 2) sub-rbol derecho, 3) raz
A
B D G E
C F
20
o Muestra el resultado de recorrer en pre-orden, in-orden, post-orden y por niveles el siguiente rbol:
+ 5 / 8 4 1 21 * 2
4. Operaciones de recorrido
Ejercicio 2
o Estructura de datos muy verstil, sirve para la implementacin de diccionarios y de colas de prioridad o Es una generalizacin de la bsqueda dicotmica
o Soporta eficientemente las operaciones de bsqueda, localizar el mnimo, el mximo, el predecesor y el successor o Tambin soporta eficientemente las operaciones de insercin y borrado
22
NodoABB
NodoABB
24
package librerias.estructurasDeDatos.jerarquicos; class NodoABB<E> { E dato; // Dato almacenado en el nodo NodoABB<E> izq, der; // Nodos hijo // Constructores NodoABB(E dato, NodoABB<E> izquierdo, NodoABB<E> derecho) { this.dato = dato; this.izq = izquierdo; this.der = derecho; } NodoABB(E dato) { this(dato, null, null); } }
25
package librerias.estructurasDeDatos.jerarquicos;
public class ABB<E extends Comparable<E>> { // Atributos nodo raz del rbol protected NodoABB<E> raiz; protected int talla; nmero de nodos del rbol /** Constructor de un ABB vacio **/ public ABB() { raiz = null; talla = 0; }
26
// Busca el dato x en el ABB y lo devuelve. // Si no lo encuentra devuelve null public E recuperar(E x) { NodoABB<E> nodo = raiz; while (nodo != null) { int resC = x.compareTo(nodo.dato); if (resC == 0) return nodo.dato; nodo = resC < 0 ? nodo.izq : nodo.der; } return null; } Ejemplo: 2 bsqueda del dato 3 1 5 3
7 9
27
o Ejercicio 3: si se busca el nmero 363 en un ABB que contiene nmeros del 1 al 1000 Cul de las siguientes secuencias de nodos no puede ser la secuencia de nodos examinada? a) 2, 252, 401, 398, 330, 344, 397, 363 b) 924, 220, 911, 244, 898, 258, 362, 363 c) 925, 202, 911, 240, 912, 245, 363 d) 2, 399, 387, 219, 266, 382, 381, 278, 363 e) 935, 278, 347, 621, 299, 392, 358, 363
28
// Inserta el dato x en el ABB sin permitir repetidos public void insertar(E x) { NodoABB<E> ant = null, nuevo, nodo = raiz; int resC = -1; while (nodo != null && ((resC = x.compareTo(nodo.dato)) != 0)) { ant = nodo; nodo = resC < 0 ? nodo.izq: nodo.der; } if (nodo == null) { nuevo = new NodoABB<E>(x); if (raiz == null) raiz = nuevo; else if (resC < 0) ant.izq = nuevo; else ant.der = nuevo; talla++; } }
29
o Ejemplo: insertar el 6
o El mtodo para actualizar un dato del ABB sera muy similar al anterior:
public E actualizar(E x) { E res = null; // Igual que insertar } else { // Si el dato ya existe res = nodo.dato; nodo.dato = x; } return res; }
30
o El mnimo en un ABB no tiene hijo izquierdo y no pertenece a ningn subrbol derecho de ningn nodo.
// Devuelve el mnimo public E recuperarMin() { NodoABB<E> nodo = raiz; if (nodo == null) return null; while (nodo.izq != null) nodo = nodo.izq; return nodo.dato; }
31
o El borrado del mnimo se disea de forma distinta para su posterior reutilizacin en el mtodo eliminar:
public E eliminarMin() { if (raiz == null) return null; return eliminarMin(raiz, null).dato; } protected NodoABB<E> eliminarMin(NodoABB<E> nodo, NodoABB<E> padre) { NodoABB<E> ant = padre; while (nodo.izq != null) { ant = nodo; nodo = nodo.izq; } if (ant == null) raiz = raiz.der; else if (ant.izq == nodo) ant.izq = nodo.der; else ant.der = nodo.der; talla--; return nodo; }
32
Posibles casos:
a) El nodo a eliminar no tiene hijos Ejemplo: el 3 (se elimina sin problemas) b) El nodo a eliminar tiene un hijo Ejemplo: el 5 Su hijo ocupa su posicin:
7 2 1 3 9
c) El nodo a eliminar tiene dos hijos Ejemplo: el 2 El mnimo de su subrbol derecho ocupa su posicin:
7 3 1 5 9
33
public E eliminar(E x) { // Elimina el nodo que contiene x E res; NodoABB<E> nodo = raiz, ant = null; int resC = -1; while (nodo!=null && ((resC=x.compareTo(nodo.dato))!=0)) { ant = nodo; nodo = resC < 0 ? nodo.izq : nodo.der; } if (nodo == null) return null; // No encontrado res = nodo.dato; if (nodo.izq != null && nodo.der != null) // 2 hijos nodo.dato = eliminarMin(nodo.der, nodo).dato; else { // 1 hijo o ninguno NodoABB<E> aux = nodo.izq != null ? nodo.izq : nodo.der; if (ant == null) raiz = aux; else if (ant.izq == nodo) ant.izq = aux; else ant.der = aux; talla--; } return res; }
34
o Los mtodos para imprimir en Post-Orden y en In-Orden son muy similares (slo cambia el orden de las instrucciones)
35
o El recorrido por niveles, al ser iterativo, utiliza una Cola como estructura auxiliar
public String porNiveles() { if (raiz == null) return ""; Cola<NodoABB<E>> q = new ArrayCola<NodoABB<E>>(); q.encolar(raiz); String res = ""; while (!q.esVacia()) { NodoABB<E> actual = q.desencolar(); res += actual.dato.toString() + "\n"; if (actual.izq != null) q.encolar(actual.izq); if (actual.der != null) q.encolar(actual.der); 36 } return res; }
o Si un nodo tiene subrbol derecho, el sucesor de dicho nodo es el mnimo de su subrbol derecho o Sino, el sucesor es el ascendiente por la derecha ms cercano o El sucesor de un nodo equivale al siguiente nodo que se obtendra en un recorrido in-orden del rbol:
5 2 1 3 7 9
37
/** Obtiene el sucesor de e en un ABB. * Si no existe tal sucesor, devuelve null para * advertirlo */ public E sucesor(E e) { E sucesor = null; NodoABB<E> aux = this.raiz; while (aux != null) { int resC = aux.dato.compareTo(e); if (resC > 0) { sucesor = aux.dato; aux = aux.izq; } else aux = aux.der; } return sucesor; }
38
EDA
minimo () eliminarMin()
o El coste de las operaciones en un ABB est en funcin de la altura del rbol (h) o La altura h est entre (log2n) y O(n) o En el peor caso (ABB desbalanceado), los costes son lineales
39
o Ejercicio 4: Disear un mtodo que devuelva el dato que est en el nodo padre de un elemento dado. Indica el coste temporal del mtodo. o Ejercicio 5: Disea un mtodo que devuelva el nivel del nodo que contiene el dato x (se supone que no hay datos duplicados) o Ejercicio 6: Disea un nuevo constructor para la clase ABB que, partiendo de un ABB vaco, inserte los datos de un vector de forma que el ABB resultante quede equilibrado.
40
o Ejercicio 8: Disea la clase ABBInteger como un ABB que trabaja con datos de tipo Integer, y aade los siguientes mtodos:
Un mtodo que obtenga la suma de todos los elementos que sean mayores o iguales a un valor entero dado Un mtodo que cambie el signo de todos los datos del rbol. El ABB debe seguir manteniendo la propiedad de orden
41
o Ejercicio 9: Disear un mtodo en un ABB para eliminar todos los elementos menores que uno dado. o Ejercicio 10: Disea en la clase ABB un mtodo para obtener el predecesor de un dato x dado
El predecesor de un nodo es el mximo de su subrbol izquierdo (si tiene) o, en caso contrario, el ascendiente por la izquierda ms cercano.
42
o El modelo Map permite realizar bsquedas por clave para obtener el valor asociado a dicha entrada o Una entrada es un par (clave, valor) o No se permiten elementos repetidos, es decir, dos entradas con la misma clave Para implementar la interfaz Map necesitamos definir la clase EntradaDic
public interface Map<C, V> { V insertar(C c, V v); V eliminar(C c); V recuperar(C c); boolean esVacio(); int talla(); ListaConPI<C> claves(); }
6. La clase ABBMap
Propuesta de implementacin
43
class EntradaMap<C extends Comparable<C>,E> implements Comparable<EntradaMap<C,E>> { C clave; E valor; public EntradaMap(C c, E e) { clave = c; valor = e; } public EntradaMap(C c) { this(c, null); } public boolean equals(Object x) { return ((EntradaMap<C,E>)x).clave.equals(this.clave); } public int compareTo(EntradaMap<C,E> x) { return this.clave.compareTo(x.clave); } public String toString() { return this.clave + " => " + this.valor; } }
6. La clase ABBMap
La clase EntradaMap
44
public class ABBMap<C extends Comparable<C>,V> implements Map<C,V> { private ABB<EntradaMap<C,V>> abb; public ABBMap() { abb = new ABB<EntradaMap<C,V>>(); } public V insertar(C c, V v) { EntradaMap<C,V> nuevo = new EntradaMap<C,V>(c,v); EntradaMap<C,V> ant = abb.actualizar(nuevo); return ant == null ? null : ant.valor; } public V eliminar(C c) { EntradaMap<C,V> ant = abb.eliminar( new EntradaMap<C,V>(c)); return ant == null ? null : ant.valor; } ...
6. La clase ABBMap
Propuesta de implementacin
45
o Los mtodos eliminarMin y recuperarMin se heredan tal cual de la clase ABB o Es necesario definir el mtodo esVacia ya que cambia de gnero (en ABB se llama esVacio) o Hace falta sobrescribir el mtodo insertar para permitir la insercin de elementos duplicados
public interface ColaPrioridad<E extends Comparable<E>> { void insertar(E e); E eliminarMin(); E recuperarMin(); boolean esVacia(); }
7. La clase ABBColaPrioridad
Propuesta de implementacin
46
public class ABBColaPrioridad<E extends Comparable<E>> extends ABB<E> implements ColaPrioridad<E> { public boolean esVacia() { return super.esVacio(); } public void insertar(E x) { NodoABB<E> ant = null, nodo = raiz; int resC = -1; while (nodo != null) { resC = x.compareTo(nodo.dato); ant = nodo; nodo = resC < 0 ? nodo.izq: nodo.der; } NodoABB<E> nuevo = new NodoABB<E>(x); if (raiz == null) raiz = nuevo; else if (resC < 0) ant.izq = nuevo; else ant.der = nuevo; talla++; } }
7. La clase ABBColaPrioridad
Propuesta de implementacin
47
o Los rboles balanceados son estructuras de datos basadas en rboles que incluyen informacin y/o operaciones adicionales para conseguir un equilibrio en los rboles o Su funcionamiento se basa en efectuar rotaciones: se intercambian nodos y subrboles en un rbol binario de bsqueda para conseguir otro equivalente
8. rboles equilibrados
Introduccin
48
o rboles AVL
8. rboles equilibrados
Almacenan el factor de equilibrio en cada nodo Permanecen balanceados en todo momento
o rboles rojo-negro
Cada nodo tiene un atributo indicando su color (rojo o negro) Al igual que los AVL, permanecen equilibrados en todo momento
o Splay-trees
Suben (mediante rotaciones) el elemento insertado/buscado a la raz y con ello se mantiene balanceado
o DayStoutWarren (DSW)
Consigue balancear el ABB (est como est previamente) en O(n)
49