n15 Arbolesbinarios Arbolesbinariosordenados

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 45

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 en -Recorrido en -Recorrido en


inorden preorden postorden

-Recorrido por - Iterador -Estructura - Algoritmo recursivo


niveles recursiva

ISIS1206 – Estructuras de Datos


http://cupi2.uniandes.edu.co
4

Ejercicio
• 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 :
ISIS1206 – Estructuras de Datos
http://cupi2.uniandes.edu.co
5

Árboles binarios
• Formalismo Abstracto
e2

e4 e5
e1
r
e2 e3
e3
a1 a2 e4 e5 e6 e7
e6 e7

• Invariante
{inv: a1 y a2 son disyuntos}
ISIS1206 – Estructuras de Datos
http://cupi2.uniandes.edu.co
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 darPeso( )


{
int p1 = ( izqNodo == null ) ? 0 : izqNodo.darPeso( );
int p2 = ( derNodo == null ) ? 0 : derNodo.darPeso( );
return p1 + p2 + 1;
}
}
ISIS1206 – Estructuras de Datos
http://cupi2.uniandes.edu.co
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 && derNodo == null;
}
}

ISIS1206 – Estructuras de Datos


http://cupi2.uniandes.edu.co
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 darAltura( )


{
int a1 = ( izqNodo == null ) ? 0 : izqNodo.darAltura( );
int a2 = ( derNodo == null ) ? 0 : derNodo.darAltura( );
return ( 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 IteradorSimple( int tamanio )


public void agregar( T elem ) throws IteradorException
public void insertar( T elem ) throws IteradorException
public int darSigPosLibre( )
public int darPosActual( )
public 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

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 35
10 30
10
5 15 25 35
5 15

ISIS1206 – Estructuras de Datos


http://cupi2.uniandes.edu.co
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

10 30
30

5 15 25 35
25 35

ISIS1206 – Estructuras de Datos


http://cupi2.uniandes.edu.co
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

10 30 10 30

5 15 25 35 5 15 35

ISIS1206 – Estructuras de Datos


http://cupi2.uniandes.edu.co
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

10 30 10 30

5 15 25 35 5 25 35

ISIS1206 – Estructuras de Datos


http://cupi2.uniandes.edu.co
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

También podría gustarte