You are on page 1of 11

UNIVERSIDAD ANDINA DEL

CUSCO
Escuela Profesional De Ingeniera De Sistemas
TEMA:

Arboles AVL

CURSO:
Algortmica y
Laboratorio de
Programacin II
DOCENTE:

Ing. Ramiro Mora


Jimenez
INTEGRANTES:
Lucy Alexandra Ccosco
Hancco

GRUPO:
:

CUSCO-PER
2016

Universidad Andina del Cusco


rboles AVL (rboles binarios de bsqueda
equilibrados)
El rbol AVL toma su nombre de las iniciales de los apellidos de sus
inventores, Adelson-Velskii y Landis. Lo dieron a conocer en la publicacin de
un artculo en 1962: "An algorithm for the organization of information" ("Un
algoritmo para la organizacin de la informacin").
Los rboles AVL estn siempre equilibrados de tal modo que para todos los
nodos, la altura de la rama izquierda no difiere en ms de una unidad de la
altura de la rama derecha o viceversa. Gracias a esta forma de equilibrio (o
balanceo), la complejidad de una bsqueda en uno de estos rboles se
mantiene siempre en orden de complejidad O(log n).

El factor de equilibrio puede ser almacenado directamente en cada nodo o


ser computado a partir de las alturas de los subrboles.
Para conseguir esta propiedad de equilibrio, la insercin y el borrado de los
nodos se a de realizar de una forma especial. Si al realizar una operacin de
insercin o borrado se rompe la condicin de equilibrio, hay que realizar una
serie de rotaciones de los nodos.
Los rboles AVL ms profundos son los rboles de Fibonacci.

ROTACIONES
El reequilibrado se produce de abajo hacia arriba sobre los nodos en los que se
produce el desequilibrio. Pueden darse dos casos: rotacin simple o rotacin
doble; a su vez ambos casos pueden ser hacia la derecha o hacia la izquierda.
Rotacin simple a la derecha
De un rbol de raz (r) y de hijos izquierdo (i) y derecho (d), lo que haremos
ser formar un nuevo rbol cuya raz sea la raz del hijo izquierdo, como hijo
izquierdo colocamos el hijo izquierdo de i (nuestro i) y como hijo derecho
construimos un nuevo rbol que tendr como raz, la raz del rbol (r), el hijo
derecho de i (d) ser el hijo izquierdo y el hijo derecho ser el hijo derecho del
rbol (d).

Escuela Profesional de Ingeniera de Sistemas

Pgina 1

Universidad Andina del Cusco

CODIFICACION DE RBOLES AVL:


PROGRAMA PRINCIPAL
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{ArbolAVL arbolAVL = new ArbolAVL();
int Opcion = 0;
NodoArbolAVL raiz = null;
int Elemento;
string Fin;
do
{
Opcion = Menu();
switch (Opcion)
{
case 1:
do{
Console.WriteLine("Ingrese el elemento a insertar:");
Elemento = int.Parse(Console.ReadLine());
arbolAVL.Insertar(Elemento);
Console.WriteLine("Terminar de Insertar Elementos...");
Fin = Console.ReadLine();
}
while (Fin != "s");
break;
// Pre Orden del Arbol
case 2:
arbolAVL.PreOrden(arbolAVL.obtenerRaiz());
Console.WriteLine("Fin del Recorrido,...");
Console.ReadLine();
Console.Clear();
break;
// Post Orden del Arbol
case 3:
arbolAVL.PostOrden(arbolAVL.obtenerRaiz());
Console.WriteLine("Fin del Recorrido,...");
Console.ReadLine();
Console.Clear();
break;
// In Orden del Arbol
case 4:
arbolAVL.InOrden(arbolAVL.obtenerRaiz());

Escuela Profesional de Ingeniera de Sistemas

Pgina 2

Universidad Andina del Cusco


Console.WriteLine("Fin del Recorrido,...");
Console.ReadLine();
Console.Clear();
break;
case 5:
if (arbolAVL!=null)
{
Console.WriteLine("ingresa el Nodo a Eliminar...","Eliminando Nodo");
Elemento = int.Parse(Console.ReadLine());

AVL");

if (arbolAVL.Eliminar(Elemento) == false)
{
Console.WriteLine("El nodo a Eliminar no se encuentra en el Arbol
Console.WriteLine("Nodo NO encontrado");
}
else
{
Console.WriteLine("El Nodo Ha Sido Eliminado del Arbol");
Console.WriteLine("Nodo Eliminadoo!!!");
}

}
else
{
Console.WriteLine("El Arbol Esta Vacio");
}
break;
case 6: Finalizar();
break;

}
} while (Opcion !=6);
}
static int Menu()
{

int Resultado = 0;
do
{
Console.WriteLine("MENU DE ARBOLES");
Console.WriteLine("");
Console.WriteLine("1.- Registrar un Nuevo Nodo");
Console.WriteLine("2.- Recorrido en Pre-orden");
Console.WriteLine("3.- Recorrido en Post-orden");
Console.WriteLine("4.- Recorrido en In-orden");
Console.WriteLine("5.- Eliminar un Nodo");
Console.WriteLine("6.- Finalizar el Programa");
Console.WriteLine("");
Console.Write("Presione una opcion: ");
Resultado = int.Parse(Console.ReadLine());
Console.WriteLine("");
if (Resultado < 1 || Resultado > 6)
{
Console.WriteLine("ERROR, Opcion Invalida");
Console.ReadLine();
Console.WriteLine("");
}

Escuela Profesional de Ingeniera de Sistemas

Pgina 3

Universidad Andina del Cusco


Console.Clear();
} while (Resultado < 1 || Resultado > 6);
return Resultado;
}
static void Finalizar()
{
Console.WriteLine("Fin del Programa, Presione cualquier Tecla");
Console.ReadLine();
}
}

//----------------------------------------------------------------------------------

CLASE ARBOL AVL


namespace ConsoleApplication4
{
public class ArbolAVL
{
private NodoArbolAVL raiz;
private int cant;
public ArbolAVL()
{
raiz = null;
}
public NodoArbolAVL obtenerRaiz()
{
return raiz;
}
//BUSCAR
public virtual NodoArbolAVL buscar(int d, NodoArbolAVL r)
{
if (raiz == null)
{
return null;
}
else if (r.dato == d)
{
return r;
}
else if (r.dato < d)
{
return buscar(d, r.hijoDer);
}
else
{
return buscar(d, r.hijoIzq);
}
}
//Obtener el Factor de Equilibrio
public virtual int obtenerFE(NodoArbolAVL x)
{
if (x == null)
{
return -1;
}
else
{
return x.fe;
}
}

Escuela Profesional de Ingeniera de Sistemas

Pgina 4

Universidad Andina del Cusco


//rotacion Simple Izquierda
public NodoArbolAVL rotaIzquierda(NodoArbolAVL c)
{
NodoArbolAVL aux = c.hijoIzq;
c.hijoIzq = aux.hijoDer;
aux.hijoDer = c;
c.fe = Math.Max(obtenerFE(c.hijoIzq), obtenerFE(c.hijoDer)) + 1;
aux.fe = Math.Max(obtenerFE(aux.hijoIzq), obtenerFE(aux.hijoDer)) + 1;
return aux;
}
//Rotacion Simple Derecha
public virtual NodoArbolAVL rotaDerecha(NodoArbolAVL c)
{
NodoArbolAVL aux = c.hijoDer;
c.hijoDer = aux.hijoIzq;
aux.hijoIzq = c;
c.fe = Math.Max(obtenerFE(c.hijoIzq), obtenerFE(c.hijoDer)) + 1;
aux.fe = Math.Max(obtenerFE(aux.hijoIzq), obtenerFE(aux.hijoDer)) + 1;
return aux;
}
//Rotacion Doble a la Izquierda
public virtual NodoArbolAVL rotaDobleIzquierda(NodoArbolAVL c)
{
NodoArbolAVL temp;
c.hijoIzq = rotaDerecha(c.hijoIzq);
temp = rotaIzquierda(c);
return temp;
}
//Rotacion Doble a la Derecha
public virtual NodoArbolAVL rotaDobleDerecha(NodoArbolAVL c)
{
NodoArbolAVL temp;
c.hijoDer = rotaIzquierda(c.hijoDer);
temp = rotaDerecha(c);
return temp;
}
//Metodo Insertar AVL
public virtual NodoArbolAVL insertarAVL(NodoArbolAVL nuevo, NodoArbolAVL subAr)
{
NodoArbolAVL nuevoPadre = subAr;
if (nuevo.dato < subAr.dato)
{
if (subAr.hijoIzq == null)
{
subAr.hijoIzq = nuevo;
}
else
{
subAr.hijoIzq = insertarAVL(nuevo, subAr.hijoIzq);
if ((obtenerFE(subAr.hijoIzq) - obtenerFE(subAr.hijoDer) == 2))
{
if (nuevo.dato < subAr.hijoIzq.dato)
{
nuevoPadre = rotaIzquierda(subAr);
}
else
{
nuevoPadre = rotaDobleIzquierda(subAr);
}
}
}
}

Escuela Profesional de Ingeniera de Sistemas

Pgina 5

Universidad Andina del Cusco


else if (nuevo.dato > subAr.dato)
{
if (subAr.hijoDer == null)
{
subAr.hijoDer = nuevo;
}
else
{
subAr.hijoDer = insertarAVL(nuevo, subAr.hijoDer);
if ((obtenerFE(subAr.hijoDer) - obtenerFE(subAr.hijoIzq) == 2))
{
if (nuevo.dato > subAr.hijoDer.dato)
{
nuevoPadre = rotaDerecha(subAr);
}
else
{
nuevoPadre = rotaDobleDerecha(subAr);
}
}
}
}
else
{
Console.WriteLine("No se puede insertar el Nodo porque ya Existe en el ARBOL
AVL");

}
//ACTUALIZZAR LA ALTURA
if ((subAr.hijoIzq == null) && (subAr.hijoDer != null))
{
subAr.fe = subAr.hijoDer.fe + 1;
}
else if ((subAr.hijoDer == null) && (subAr.hijoIzq != null))
{
subAr.fe = subAr.hijoIzq.fe + 1;
}
else
{
subAr.fe = Math.Max(obtenerFE(subAr.hijoIzq), obtenerFE(subAr.hijoDer)) + 1;
}
return nuevoPadre;

}
//METODO PARA INSERTAR
public virtual void Insertar(int d)
{
NodoArbolAVL nuevo = new NodoArbolAVL(d);
if (raiz == null)
{
raiz = nuevo;
}
else
{
raiz = insertarAVL(nuevo, raiz);
}
}
// recorridos
//Metodo para recorrer el arbol InOrden
public virtual void InOrden(NodoArbolAVL r)
{
if (r != null)
{
InOrden(r.hijoIzq);

Escuela Profesional de Ingeniera de Sistemas

Pgina 6

Universidad Andina del Cusco


Console.Write(r.dato + ", ");
InOrden(r.hijoDer);

}
}
// para recorrer el arbol PreOrden
public virtual void PreOrden(NodoArbolAVL r)
{
if (r != null)
{
Console.Write(r.dato + ", ");
PreOrden(r.hijoIzq);
PreOrden(r.hijoDer);
}
}
// para recorrer el arbol PostOrden
public virtual void PostOrden(NodoArbolAVL r)
{
if (r != null)
{
PostOrden(r.hijoIzq);
PostOrden(r.hijoDer);
Console.Write(r.dato + ", ");
}
}
public virtual bool Eliminar(int d)
{
NodoArbolAVL aux = raiz;
NodoArbolAVL padre = raiz;
bool eshijoIzq = true;
while (aux.dato != d)
{
padre = aux;
if (d < aux.dato)
{
eshijoIzq = true;
aux = aux.hijoIzq;
}
else
{
eshijoIzq = false;
aux = aux.hijoDer;
}
if (aux == null)
{
return false;
}
} //Fin de While
if (aux.hijoIzq == null && aux.hijoDer == null)
{
if (aux == raiz)
{
raiz = null;
}
else if (eshijoIzq)
{
padre.hijoIzq = null;
}
else

Escuela Profesional de Ingeniera de Sistemas

Pgina 7

Universidad Andina del Cusco


{
}

padre.hijoDer = null;

}
else if (aux.hijoDer == null)
{
if (aux == raiz)
{
raiz = aux.hijoIzq;
}
else if (eshijoIzq)
{
padre.hijoIzq = aux.hijoIzq;
}
else
{
padre.hijoDer = aux.hijoIzq;
}
}
else if (aux.hijoIzq == null)
{
if (aux == raiz)
{
raiz = aux.hijoDer;
}
else if (eshijoIzq)
{
padre.hijoIzq = aux.hijoDer;
}
else
{
padre.hijoDer = aux.hijoIzq;
}
}
else
{
NodoArbolAVL reemplazo = obtenerNodoReemplazo(aux);
if (aux == raiz)
{
raiz = reemplazo;
}
else if (eshijoIzq)
{
padre.hijoIzq = reemplazo;
}
else
{
padre.hijoDer = reemplazo;
}
reemplazo.hijoIzq = aux.hijoIzq;
}
return true;

nodoReemp)

//Metodo Encargado de Devolvernos el nodo Reemplazo


public virtual NodoArbolAVL obtenerNodoReemplazo(NodoArbolAVL
{

NodoArbolAVL reemplazarPadre = nodoReemp;


NodoArbolAVL reemplazo = nodoReemp;
NodoArbolAVL aux = nodoReemp.hijoDer;
while (aux != null)

Escuela Profesional de Ingeniera de Sistemas

Pgina 8

Universidad Andina del Cusco


{
reemplazarPadre = reemplazo;
reemplazo = aux;
aux = aux.hijoIzq;

}
if (reemplazo != nodoReemp.hijoDer)
{
reemplazarPadre.hijoIzq = reemplazo.hijoDer;
reemplazo.hijoDer = nodoReemp.hijoDer;
}
//Console.WriteLine("El Nodo Reemplazo es:" + reemplazo);
return reemplazo;
}
}

//----------------------------------------------------------------------------------

CLASE NODO ARBOL AVL


namespace ConsoleApplication4
{
public class NodoArbolAVL
{
public int dato, fe;
public NodoArbolAVL hijoIzq;
public NodoArbolAVL hijoDer;
public NodoArbolAVL(int d)
{
this.dato = d;
this.fe = 0;
this.hijoIzq = null;
this.hijoDer = null;
}
}

Escuela Profesional de Ingeniera de Sistemas

Pgina 9

Universidad Andina del Cusco

REFERENCIAS
MICROSOFT.(2012-2016) code.msdn.microsoft.com
(https://code.msdn.microsoft.com/windowsdesktop/Arbol-AVL-b5b61d9f)
SEBASTIAN GURIN (2004-2015) tldp.org
(http://es.tldp.org/Tutoriales/doc-programacion-arboles-avl/avl-trees.pdf)
ABRAN GARCIA (2011-2015) decsai.ugr.es
(http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/avl.html)
UNIVERIDAD FARANCISCO DE PAULA SANTANDER (2014-2016).
ingsistemas.ufps.edu(http://ingsistemas.ufps.edu.co/SEED/arbolavl.html)

Escuela Profesional de Ingeniera de Sistemas

Pgina 10