Download Descargar

Document related concepts
no text concepts found
Transcript
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