You are on page 1of 46

rboles de bsqueda

Parte 1

Felipe Restrepo Calle


ferestrepoca@unal.edu.co

Departamento de Ingeniera de Sistemas e Industrial


Facultad de Ingeniera
Universidad Nacional de Colombia
Sede Bogot
rboles de bsqueda
ADT BST AVL

ADT rbol de bsqueda:

1. rbol de Bsqueda Binaria BST:

a) rboles AVL

Estructuras de Datos rboles 2


rboles de bsqueda
ADT BST AVL

rbol de bsqueda ADT


Una de las aplicaciones ms importante de los rboles
es su uso en bsquedas
rboles de bsqueda = rboles n-arios de bsqueda =
rboles multi-camino de bsqueda
Son un tipo particular de rboles, que pueden definirse
cuando los elementos del rbol poseen una relacin de
orden total

Estructuras de Datos rboles 3


rboles de bsqueda
ADT BST AVL

rbol de bsqueda ADT


Un rbol de bsqueda T es un rbol n-ario vaco o que
cumple las siguientes propiedades:
a) La raz de T contiene A0, , An-1 subrboles (hijos), que
almacenan K1, , Kn-1 datos
b) Ki < Ki+1, 1 i < n-1
c) Todas los datos almacenados en el subrbol Ai son:
i. menores que Ki+1 0 i < n-1
ii. mayores que Ki 0 < i n-1
d) Los subrboles Ai, 0 i n-1 son tambin rboles de
bsqueda
Estructuras de Datos rboles 4
rboles de bsqueda
ADT BST AVL

rbol de bsqueda ADT Operaciones


Insertar
Eliminar
Buscar (por la clave)
La clave es un identificador almacenado en el nodo
Las claves se pueden comparar:
En Java se usa la interface Comparable
La comparacin cumple la propiedad transitiva
No se utilizan ndices en la bsqueda (como en arreglos)

Estructuras de Datos rboles 5


rboles de bsqueda
ADT BST AVL

rbol de bsqueda binaria BST (Binary Search Tree)

Propiedades:
Las claves almacenadas en el subrbol izquierdo son menores que
la raz
Las claves en el subrbol derecho son mayores que la raz
Todos los subrboles cumplen estas propiedades
Estructuras de Datos rboles 6
rboles de bsqueda
ADT BST AVL

rbol de bsqueda binaria BST


Ejemplo:

rbol BST rbol binario (no BST)


Estructuras de Datos rboles 7
rboles de bsqueda
ADT BST AVL

Implementacin BST
Nodo de rbol binario:

private static class BinaryNode<T>


{
T element; // The data in the node
BinaryNode<T> left; // Left child
BinaryNode<T> right; // Right child

Constructores
}

Estructuras de Datos rboles 8


rboles de bsqueda
ADT BST AVL

Implementacin BST
Clase BinarySearchTree:
public class BinarySearchTree<T extends Comparable<? super T>>
{
private static class BinaryNode<T>
{
Clase de la diapositiva anterior
}

private BinaryNode<T> root;

Mtodos
}

Estructuras de Datos rboles 9


rboles de bsqueda
ADT BST AVL

Operaciones
public class BinarySearchTree<T extends Comparable<? super T>>
{ public BinarySearchTree( )
public void insert( T x )
public void remove( T x )
public T findMin( )
public T findMax( )
public boolean contains( T x )
public void makeEmpty( )
public boolean isEmpty( )
public void printTree( )
private BinaryNode<T> insert( T x, BinaryNode<T> t )
private BinaryNode<T> remove( T x, BinaryNode<T> t )
private BinaryNode<T> findMin( BinaryNode<T> t )
private BinaryNode<T> findMax( BinaryNode<T> t )
private boolean contains( T x, BinaryNode<T> t )
private void printTree( BinaryNode<T> t )
private int height( BinaryNode<T> t )
}

Estructuras de Datos rboles 10


rboles de bsqueda
ADT BST AVL

Operaciones
public BinarySearchTree( ) // Construct the tree
{
root = null;
}

public void makeEmpty( ) // Make the tree logically empty


{
root = null;
}

public boolean isEmpty( ) // Test if the tree is empty


{
return root == null;
}

Estructuras de Datos rboles 11


rboles de bsqueda
ADT BST AVL

Operaciones: insertar
Insertar: Comparar el nuevo dato con el nodo actual; si es mayor,
insertar en el subrbol derecho, si es menor, insertar en el izquierdo

insert(x, Node t)
if (t == null)
return new Node(x)
if (x > t.element)
t.right = insert(x, t.right)
if (x < t.key)
t.left = insert(x, t.left)
return t

Estructuras de Datos rboles 12


rboles de bsqueda
ADT BST AVL

Operaciones: insertar
public void insert( T x )
{ root = insert( x, root ); }

private BinaryNode<T> insert( T x, BinaryNode<T> t )


{ if( t == null )
return new BinaryNode<>( x, null, null );

int compareResult = x.compareTo( t.element );


if( compareResult < 0 )
t.left = insert( x, t.left );
else if( compareResult > 0 )
t.right = insert( x, t.right );
else
; // Duplicate; do nothing
return t;
}

Estructuras de Datos rboles 13


rboles de bsqueda
ADT BST AVL

Operaciones: bsqueda

contains(x,t) // similar to insert


if (t == null)
return false
if (x == t.element)
return true
if (x > t.element)
return contains(x, t.right)
if (x < t.element)
return contains(x, t.left)

Estructuras de Datos rboles 14


rboles de bsqueda
ADT BST AVL

Operaciones: bsqueda
public boolean contains( T x )
{ return contains( x, root );
}

private boolean contains( T x, BinaryNode<T> t )


{ if( t == null )
return false;
int compareResult = x.compareTo( t.element );
if( compareResult < 0 )
return contains( x, t.left );
else if( compareResult > 0 )
return contains( x, t.right );
else
return true; // Match
}

Estructuras de Datos rboles 15


rboles de bsqueda
ADT BST AVL

Operaciones: mnimo
findMin(t) // return left-most node
if (t.left == null)
return t.element
else
return findMin(t.left)

Estructuras de Datos rboles 16


rboles de bsqueda
ADT BST AVL

Operaciones: mnimo
public T findMin( )
{
if( isEmpty( ) )
throw new UnderflowException( );
return findMin( root ).element;
}

private BinaryNode<T> findMin( BinaryNode<T> t )


{
if( t == null )
return null;
else if( t.left == null )
return t;
return findMin( t.left );
}

Estructuras de Datos rboles 17


rboles de bsqueda
ADT BST AVL

Operaciones: mnimo
Versin findMin (no recursiva):
private BinaryNode<T> findMin( BinaryNode<T> t )
{
if( t != null )
while( t.left != null )
t = t.left;

return t;
}

Estructuras de Datos rboles 18


rboles de bsqueda
ADT BST AVL

Operaciones: eliminacin

Eliminar una hoja es fcil.

Eliminar una nodo con un


solo hijo tambin es fcil.

Cmo eliminamos nodos


con dos hijos?

Estructuras de Datos rboles 19


rboles de bsqueda
ADT BST AVL

Operaciones: eliminacin
1. Buscar el nodo a eliminar t
2. Reemplazar el dato de t con el
menor nodo del subrbol derecho
a = findMin(t.right);
t.element = a.element;
3. Por ltimo, eliminar el nodo menor
original en el subrbol derecho
remove(a.element, t.right);

Estructuras de Datos rboles 20


rboles de bsqueda
ADT BST AVL

Operaciones: eliminacin
public void remove( T x )
{ root = remove( x, root ); }
private BinaryNode<T> remove( T x, BinaryNode<T> t )
{ if( t == null )
return t; // Item not found; do nothing
int compareResult = x.compareTo( t.element );
if( compareResult < 0 )
t.left = remove( x, t.left );
else if( compareResult > 0 )
t.right = remove( x, t.right );
else if( t.left != null && t.right != null ) // Two children
{ t.element = findMin( t.right ).element;
t.right = remove( t.element, t.right );
}
else
t = ( t.left != null ) ? t.left : t.right;
return t;
}
Estructuras de Datos rboles 21
rboles de bsqueda
ADT BST AVL

Operaciones: altura

private int height(BinaryNode<T> t )


{ if( t == null )
return -1;
else
return 1 + Math.max( height(t.left), height(t.right) );
}

Estructuras de Datos rboles 22


rboles de bsqueda
ADT BST AVL

Anlisis de tiempos de ejecucin


Dado un rbol BST, esperaramos que las operaciones mencionadas
tuvieran una complejidad temporal de O(log N), porque se puede
descender un nivel del rbol en tiempo constante, y por tanto, operar
en un rbol que en cada nuevo nivel tiene la mitad del tamao.

Estructuras de Datos rboles 23


rboles de bsqueda
ADT BST AVL

Anlisis de tiempos de ejecucin: peor de los casos


Sin embargo, puede haber casos como los siguientes:
Insertar la secuencia 1, 2, 3, 4, 5, 6.
Buscar el 6 en el rbol anterior.

Insertar la secuencia 1, 6, 5, 4, 3, 2.
Eliminar el 1.

O(N)

Estructuras de Datos rboles 24


rboles de bsqueda
ADT BST AVL

Anlisis de tiempos de ejecucin: peor de los casos


Cmo evitamos esto? Cmo implementamos rboles BST
que eviten que se presente el peor de los casos de la
operaciones O(N)?

Solucin: mantener el rbol balanceado.


cul es el costo de esto?

Estructuras de Datos rboles 25


rboles de bsqueda
ADT BST AVL

rbol AVL - Adelson-Velskii y Landis (1962)


rbol binario de bsqueda (BST) balanceado: AVL
Los elementos del rbol deben estar repartidos en igual
nmero entre el subrbol izquierdo y el derecho.
Un rbol est equilibrado (balanceado) respecto a la
altura si y solo si para cada uno de sus nodos ocurre que
las alturas de los dos subrboles difieren como mucho
en 1.

Problema: el mantenimiento del rbol.

Estructuras de Datos rboles 26


rboles de bsqueda
ADT BST AVL

rbol AVL
1. Un rbol vaco est balanceado con respecto a la altura
2. El rbol balanceado ptimo ser aquel que cumple:
n = 2h - 1, donde n = # nodos y h = altura

Estructuras de Datos rboles 27


rboles de bsqueda
ADT BST AVL

Implementacin AVL
Nodo en un rbol AVL:

private static class AvlNode<T>


{
T element; // Data in the node
AvlNode<T> left; // Left child
AvlNode<T> right; // Right child
int height; // Height

Constructores
}

Estructuras de Datos rboles 28


rboles de bsqueda
ADT BST AVL

Implementacin AVL

public class AvlTree<T extends Comparable<? super T>>


{
private static class AvlNode<T>
{
Clase de la diapositiva anterior
}
private AvlNode<T> root;

Mtodos
}

Estructuras de Datos rboles 29


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


Despus de realizar operaciones de insercin/eliminacin
se debe verificar que el rbol AVL mantiene su condicin.
En caso contrario, es necesario balancearlo:
Reorganizar el rbol de forma tal que un nuevo nodo se
convierta en la raz y se cumple la condicin de rbol AVL.
Esta reorganizacin se conoce como rotacin.
Existen 2 tipos de rotaciones:
Simples
Dobles

Estructuras de Datos rboles 30


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


rbol AVL antes de una operacin de insercin:

Estructuras de Datos rboles 31


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


rbol AVL despus de una operacin de insercin:

Estructuras de Datos rboles 32


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


Rotacin simple

Estructuras de Datos rboles 33


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


Rotacin simple

Funciona cuando el nuevo nodo se inserta en un


subrbol exterior (left-left o right-right).
Qu ocurre con la insercin en subrboles interiores
(left-right o right-left)?

Estructuras de Datos rboles 34


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


rbol AVL antes de la operacin de insercin:

Estructuras de Datos rboles 35


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


rbol AVL despus de la operacin de insercin:

Estructuras de Datos rboles 36


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


Una rotacin simple no es suficiente. Falla.

Estructuras de Datos rboles 37


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


Rotacin doble: situacin inicial despus de insertar

Estructuras de Datos rboles 38


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


Rotacin doble: primera rotacin R (subrbol a)

Estructuras de Datos rboles 39


rboles de bsqueda
ADT BST AVL

Operaciones: balanceo y rotaciones


Rotacin doble: segunda rotacin L (raz)

Estructuras de Datos rboles 40


rboles de bsqueda
ADT BST AVL

Operaciones: algoritmos de rotacin


Rotacin simple
Single Rotation L:
tmp = root.left
root.left = tmp.right
tmp.right = root

Estructuras de Datos rboles 41


rboles de bsqueda
ADT BST AVL

Operaciones: algoritmos de rotacin


Rotacin doble
Double Rotation LR:
singleRotate R root.left
singleRotate L root

Estructuras de Datos rboles 42


rboles de bsqueda
ADT BST AVL

Anlisis de complejidad temporal de las rotaciones

Nmero constante de re-organizacin de enlaces, no


depende el nmero de nodos del rbol.

En las rotaciones dobles se necesita el doble nmero de


re-organizaciones pero sigue siendo constante.

Estructuras de Datos rboles 43


rboles de bsqueda
ADT BST AVL

Resumen complejidad temporal

Estructuras de Datos rboles 44


rboles de bsqueda
ADT BST AVL

Tarea
1. Revisar y probar las siguientes clases:
a) BinarySearchTree.java
b) AvlTree.java

Estructuras de Datos rboles 45


rboles de bsqueda
Parte 1
https://sites.google.com/a/unal.edu.co/estructuras-de-datos-2015-1/

Felipe Restrepo Calle


ferestrepoca@unal.edu.co

Departamento de Ingeniera de Sistemas e Industrial


Facultad de Ingeniera
Universidad Nacional de Colombia
Sede Bogot

You might also like