You are on page 1of 49

Tema 4

rboles, rbol Binario y rbol Binario de Bsqueda

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

Relacin entre modelos e implementaciones


rboles

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

eda librerias estructurasDeDatos algoritmos aplicaciones 6 letras hospital

1. Conceptos de rboles
Estructuras jerrquicas *
+ -

o Ejemplo 2: el rbol que se muestra a continuacin representa la expresin aritmtica (((a*b)+(c+d))*(e-f)):

*
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

Nodos hoja: {D, M, N, F, J, K, L} Nodos internos: {A, B, E, I, C, G, H }

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

Subrbol con raz 10

2. rboles generales
Representacin
o Listas (ordenadas) de hijos

o Representacin de rboles generales (nmero de hijos de los nodos sin acotar:


o Hijo ms a la izquierda hermano derecho o Con vectores y referencias al padre (mf-sets) o Otras

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

hijo her. izq. dato der.

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

(2H+1 - 1) - (i=0..H-12i) = 2H (2H+1-1) - (2H) = 2H - 1

El nmero mximo de nodos internos es:

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

Por niveles: ABCDEFG

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

Pre-Orden: ABDEGCF In-Orden: DBGEACF Post-Orden: DGEBFCA

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

5. rboles binarios de bsqueda


Conceptos bsicos

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

o Un rbol binario es de bsqueda si:

5. rboles binarios de bsqueda


Definicin
Los datos de su subrbol derecho son mayores que el raz Los subrboles izquierdo y derecho tambin son rboles binarios de bsqueda

Los datos de su subrbol izquierdo son menores que el raz

o Si se imprime en in-orden resulta una secuencia ordenada


7 rbol Binario de Bsqueda: 1 3 2 5 9 rbol Binario (que no es de Bsqueda): 7 2 1 3 5 8 9
23

5. rboles binarios de bsqueda


Representacin enlazada
ABB raz NodoABB dato izq der

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); } }

5. rboles binarios de bsqueda


La clase NodoABB

25

package librerias.estructurasDeDatos.jerarquicos;

5. rboles binarios de bsqueda


La clase ABB

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

5. rboles binarios de bsqueda


Bsqueda en un ABB

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

5. rboles binarios de bsqueda


Ejercicio

// 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++; } }

5. rboles binarios de bsqueda


Insercin en un ABB

29

o Ejemplo: insertar el 6

5. rboles binarios de bsqueda


Insercin en un ABB
7 2 9 5 3 6 1

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; }

5. rboles binarios de bsqueda


Mnimo y mximo en un ABB

o El mximo es el caso simtrico.

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; }

5. rboles binarios de bsqueda


Borrado del mnimo en un ABB

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

5. rboles binarios de bsqueda


Borrado en un ABB
7 2 9 1 3 5

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; }

5. rboles binarios de bsqueda


Borrado en un ABB

34

o La forma natural de implementar los recorridos en profundidad es recursiva:

5. rboles binarios de bsqueda


Recorridos en profundidad
public String preOrden() { // Lanzadera return preOrden(raiz); } private String preOrden(NodoABB<E> actual) { if (actual == null) return ; return actual.dato.toString() + \n + preOrden(actual.izq) + preOrden(actual.der); }

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; }

5. rboles binarios de bsqueda


Recorrido en anchura

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

5. rboles binarios de bsqueda


Clculo del sucesor/predecesor

sucesor(5) = 7 sucesor(1) = 2 sucesor(3) = 5 sucesor(9) = null

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; }

5. rboles binarios de bsqueda


Clculo del sucesor/predecesor

38

EDA

5. rboles binarios de bsqueda


Coste de las operaciones
Coste promedio buscar(x) insertar(x)

minimo () eliminarMin()

Lista Enlazada / Array LEG Ordenada Array Ordenado ABB

(N) (N) (log N) (log N)

(1) (N) (N) (log N)

(N) (1) (1) (log N)

(N) (1) (1) (log N)

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.

5. rboles binarios de bsqueda


Ejercicios

40

o Ejercicio 7: Disear los siguientes mtodos en la clase ABB:


Obtener el nmero total de hojas del rbol Visualizar los datos de los nodos del nivel k del rbol Calcular la altura del rbol

5. rboles binarios de bsqueda


Ejercicios

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.

5. rboles binarios de bsqueda


Ejercicios

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

Rotacin a la derecha Rotacin a la izquierda

48

o rboles AVL

8. rboles equilibrados
Almacenan el factor de equilibrio en cada nodo Permanecen balanceados en todo momento

Los rboles balanceados ms conocidos

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

You might also like