1 NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS Árboles Binarios y Árboles Binarios Ordenados ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 2 Contenido • Árboles binarios • Iteradores • Árboles binarios ordenados ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 3 Árboles binarios • Algunas definiciones para recordar: - Subárbol - Padre - Hermano - Camino - Árbol vacío - Hoja - Rama - Completo - Hijo - Peso - Nivel - Lleno - Altura - Recorrido por niveles - ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Recorrido en inorden - Iterador Recorrido en preorden - Estructura recursiva - Recorrido en postorden - - Algoritmo recursivo 4 Ejercicio • • • • • • • • • • • • • • • • ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co La raíz del árbol es: La altura del árbol es: El peso del árbol es: Hojas? Un elemento no terminal?. De quién es hijo 15? De quién es padre 25? Un ejemplo de hermanos. El camino entre 10 y 7: La longitud del camino entre 10 y 7 es: Nivel de 25: Es árbol completo? Es árbol lleno?. El recorrido en preorden es: El recirrido en postorden es : El recorrido en inorden es : El recorrido por niveles es : 5 Árboles binarios • Formalismo Abstracto e2 e4 e1 r e2 a1 a2 e4 e3 e5 e6 e3 e7 e6 • Invariante {inv: a1 y a2 son disyuntos} ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co e5 e7 6 Árboles binarios • Cupi2 Collections tiene su propia implementación del árbol binario. • Se utiliza genericidad cupi2 collections ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 7 Implementación: ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 8 public class ArbolBinario<T> { Se manejan elementos que hereden de Comparable private NodoArbolBinario<T extends Comparable<? super T>> raiz; public int darPeso( ) { return ( raiz != null ) ? raiz.darPeso( ) : 0; } } public class NodoArbolBinario<T extends Comparable<? super T>> { private T elem; private NodoArbolBinario<T> izqNodo; T es comparable con cualquiera private NodoArbolBinario<T> derNodo; de sus supertipos public int { int p1 int p2 return } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co darPeso( ) = ( izqNodo == null ) ? 0 : izqNodo.darPeso( ); = ( derNodo == null ) ? 0 : derNodo.darPeso( ); p1 + p2 + 1; 9 Árboles binarios • Algorítmica básica: • • • Es hoja? Altura Buscar un elemento ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 10 Árboles binarios • Es hoja? public class NodoArbolBinario<T> { private T elem; private NodoArbolBinario<T> izqNodo; private NodoArbolBinario<T> derNodo; public boolean esHoja( ) { return izqNodo == null } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co && derNodo == null; 11 Árboles binarios • Altura ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 12 public class ArbolBinario<T> { private NodoArbolBinario<T> raiz; public int darAltura( ) { return ( raiz != null ) ? raiz.darAltura( ) : 0; } } public class NodoArbolBinario<T> { private T elem; private NodoArbolBinario<T> izqNodo; private NodoArbolBinario<T> derNodo; public int { int a1 int a2 return } darAltura( ) = ( izqNodo == null ) ? 0 : izqNodo.darAltura( ); = ( derNodo == null ) ? 0 : derNodo.darAltura( ); ( a1 >= a2 ) ? a1 + 1 : a2 + 1; } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 13 Árboles binarios • Buscar un elemento ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 14 public class ArbolBinario<T> { private NodoArbolBinario<T> raiz; public T buscar( T modelo ) { return ( raiz != null ) ? raiz.buscar( modelo ) : null; } } public class NodoArbolBinario<T> { public T buscar( T modelo ) { if( modelo.equals( elem ) ) return elem; else { T temp = ( izqNodo == null ) ? null : izqNodo.buscar( modelo ); if( temp != null ) return temp; else return ( derNodo == null ) ? null : derNodo.buscar( modelo ); } } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 15 Árboles binarios • Buscar un elemento: • Busca el elemento del árbol que corresponda al m odelo especificado. • modelo: Descripción del elemento que se va a buscar en el árbol. Debe contener por lo menos la información mínima necesaria para que el método de comparación del nodo pueda establecer una relación de orden. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 16 Iteradores (cupi2.collections) public interface Iterador<T> { public boolean haySiguiente( ); public T darSiguiente( ); public void reiniciar( ); } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 17 public class IteradorSimple<T> implements Iterador<T> { private final static int NADA = -1; private T[] elems; private int posActual; private int sigPosLibre; public boolean haySiguiente( ); public T darSiguiente( ); public void reiniciar( ); public public public public public public IteradorSimple( int tamanio ) void agregar( T elem ) throws IteradorException void insertar( T elem ) throws IteradorException int darSigPosLibre( ) int darPosActual( ) int darLongitud( ) } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 18 Iteradores • Para recorridos y retornos de secuencias en el árbol binario. public class ArbolBinario<T> { public Iterador<T> darInorden( ) public Iterador<T> darPreorden( ) public Iterador<T> darCamino( T elem ) throws NoExisteException public Iterador<T> darNivel( int nivel ) } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 19 Árboles e iteradores • Recorrido en inorden public class ArbolBinario<T> { public Iterador<T> darInorden( ) { IteradorSimple<T> resultado = new IteradorSimple<T>( darPeso( ) ); if( raiz != null ) { raiz.inorden( resultado ); } return resultado; } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 20 Árboles e iteradores ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 21 public class NodoArbolBinario<T> { public void inorden( IteradorSimple<T> resultado ) { if( izqNodo != null ) { izqNodo.inorden( resultado ); } try { resultado.agregar( elem ); } catch( IteradorException e ) { } if( derNodo != null ) { derNodo.inorden( resultado ); } } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 22 Árboles binarios ordenados • Formalismo abstracto e a1 a2 • Invariante { inv: a1 y a2 son disyuntos, todos los elementos de a1 son menores que e, todos los elementos de a2 son mayores que e, a1 y a2 son ordenados} ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 23 Árboles binarios ordenados • Implementación a dos niveles public class ArbolBinarioOrdenado<T extends Comparable<? super T>> { private NodoArbolBinarioOrdenado<T> raiz; private int peso; } public class NodoArbolBinarioOrdenado<T extends Comparable<? super T>> { private T elem; private NodoArbolBinarioOrdenado<T> derNodo; private NodoArbolBinarioOrdenado<T> izqNodo; } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 24 Árboles binarios ordenados • Algorítmica básica • • • Buscar Insertar Eliminar (4 variantes) ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 25 Árboles binarios ordenados • Buscar public class ArbolBinarioOrdenado<T extends Comparable<? super T>> { public T buscar( T modelo ) { return ( raiz != null ) ? raiz.buscar( modelo ) : null; } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 26 Árboles binarios ordenados • Buscar ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 27 public class NodoArbolBinarioOrdenado<T extends Comparable<? super T>> { public T buscar( T modelo ) { // Compara el valor con el valor del nodo int resultado = elem.compareTo( modelo ); if( resultado == 0 ) { // Caso 1: El elemento buscado es el elemento actual return elem; } else if( resultado > 0 ) { // Caso 2: El elemento debería estar en el subárbol izquierdo return ( izqNodo != null ) ? izqNodo.buscar( modelo ) : null; } else { // Caso 3: El elemento debería estar en el subárbol derecho return ( derNodo != null ) ? derNodo.buscar( modelo ) : null; } } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 28 Árboles binarios ordenados • Insertar public class ArbolBinarioOrdenado<T extends Comparable<? super T>> { public void insertar( T elemento ) throws ExisteException { if( raiz == null ) { // Caso 1: el árbol es vacío raiz = new NodoArbolBinarioOrdenado<T>( elemento ); } else { // Caso 2: el árbol no es vacío raiz.insertar( elemento ); } peso++; } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 29 • Insertar Árboles binarios ordenados public class NodoArbolBinarioOrdenado<T extends Comparable<? super T>> { public void insertar( T pElemento ) throws ExisteException { // Compara el valor con el valor del nodo int resultado = elem.compareTo( pElemento ); if( resultado == 0 ) { // Caso 1: El elemento a insertar es el elemento actual throw new ExisteException( "Elemento presente en el árbol" ); } else if( resultado > 0 ) { // Caso 2: El elemento se debe insertar en el subárbol izquierdo if( izqNodo == null ) izqNodo = new NodoArbolBinarioOrdenado<T>( pElemento ); else izqNodo.insertar( pElemento ); } else { // Caso 3: El elemento se debe insertar en el subárbol derecho if( derNodo == null ) derNodo = new NodoArbolBinarioOrdenado<T>( pElemento ); else derNodo.insertar( pElemento ); } } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 30 public class NodoArbolBinarioOrdenado<T extends Comparable<? super T>> { public void insertar( T pElemento ) throws ExisteException { // Compara el valor con el valor del nodo int resultado = elem.compareTo( pElemento ); if( resultado == 0 ) { // Caso 1: El elemento a insertar es el elemento actual throw new ExisteException( "Elemento presente en el árbol" ); } else if( resultado > 0 ) { // Caso 2: El elemento se debe insertar en el subárbol izquierdo if( izqNodo == null ) izqNodo = new NodoArbolBinarioOrdenado<T>( pElemento ); else izqNodo.insertar( pElemento ); } else { // Caso 3: El elemento se debe insertar en el subárbol derecho if( derNodo == null ) derNodo = new NodoArbolBinarioOrdenado<T>( pElemento ); else derNodo.insertar( pElemento ); } } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 31 Árboles binarios ordenados • Eliminar un elemento • Variante 1: Para eliminar un elemento de la raíz, se puede colocar el subárbol izquierdo a la izquierda del menor elemento del subárbol derecho: ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 32 Árboles binarios ordenados • Ejemplo 30 20 25 30 10 10 5 15 25 35 5 ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 15 35 33 Árboles binarios ordenados • Eliminar un elemento • Variante 2: Para eliminar el elemento de la raíz, se puede colocar el subárbol derecho a la derecha del menor elemento del subárbol izquierdo. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 34 Árboles binarios ordenados 10 • Ejemplo 20 5 15 30 10 30 5 15 25 35 25 ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 35 35 Árboles binarios ordenados • Eliminar un elemento • Variante 3: Para eliminar el elemento de la raíz, se puede reemplazar dicho elemento por el menor elemento del subárbol derecho ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 36 Árboles binarios ordenados • Ejemplo 25 20 30 10 5 15 ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 25 30 10 35 5 15 35 37 Árboles binarios ordenados • Eliminar un elemento • Variante 4: Para eliminar un elemento de la raíz, se puede reemplazar el elemento por el mayor elemento del subárbol izquierdo. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 38 Árboles binarios ordenados • Ejemplo 15 20 30 10 5 15 ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 25 30 10 35 5 25 35 39 Árboles binarios ordenados • Bajo las variantes 3 y 4, se consideran 3 grandes casos: • • • El elemento es la raíz. El elemento está en el subárbol izquierdo. El elemento está en el subárbol derecho. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 40 Árboles binarios ordenados • Si el elemento a eliminar es la raíz, se manejan 3 casos: • • • Es una hoja (NO HAY PROBLEMA). Sólo tiene un hijo: se coloca al hijo. Están los dos subárboles: Busca el mayor elemento del lado izquierdo, lo coloca en la raíz y hace un llamado recursivo para suprimirlo. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 41 Árboles binarios ordenados • Eliminar public class ArbolBinario<T> { private NodoArbolBinario<T> raiz; public void eliminar( T elemento ) throws NoExisteException { if( raiz != null ) { // Caso 1: el árbol no es vacío raiz = raiz.eliminar( elemento ); peso--; } else { // Caso 2: el árbol es vacío throw new NoExisteException( "El elemento especificado no existe en el árbol" ); } } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 42 public class NodoArbolBinarioOrdenado<T extends Comparable<? super T>> { public NodoArbolBinarioOrdenado<T> eliminar( T pElemento ) throws NoExisteExcep tion { // Compara el valor con el valor del nodo int resultado = elem.compareTo( pElemento ); if( resultado == 0 ) { // Caso 1: El elemento buscado es el elemento actual if( izqNodo == null ) return derNodo; else if( derNodo == null ) return izqNodo; else { elem = izqNodo.darMayor( ); izqNodo = izqNodo.eliminar( elem ); return this; } } ... ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 43 public class NodoArbolBinarioOrdenado<T extends Comparable<? super T>> { public NodoArbolBinarioOrdenado<T> eliminar( T pElemento ) throws NoExisteExcep tion { ... else if( resultado > 0 ) { // Caso 2: El elemento debe estar en el subárbol izquierdo if( izqNodo == null ) { throw new NoExisteException( "El elemento no encontrado" ); } else { izqNodo = izqNodo.eliminar( pElemento ); return this; } } ... ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 44 public class NodoArbolBinarioOrdenado<T extends Comparable<? super T>> { public NodoArbolBinarioOrdenado<T> eliminar( T pElemento ) throws NoExisteExcep tion { ... else { // Caso 3: El elemento debe estar en el subárbol derecho if( derNodo == null ) { throw new NoExisteException( "El elemento no encontrado" ); } else { derNodo = derNodo.eliminar( pElemento ); return this; } } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 45 Árboles binarios ordenados • Tarea: • • Leer árboles AVL. Estudiar árboles ordenados, árboles ordenados binarios e iteradores de cupi2.collections. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co