示例#1
0
        public nodoavl giroizq(nodoavl nodo)
        {
            //cambiar apuntadores
            nodoavl tempder = nodo.der;

            tempder.raiz = nodo.raiz;
            nodo.raiz    = tempder;
            nodo.der     = tempder.izq;
            tempder.izq  = nodo;
            if (nodo.der != null)
            {
                nodo.der.raiz = nodo;
            }
            if (tempder.raiz != null)
            {
                if (tempder.raiz.der == nodo)
                {
                    tempder.raiz.der = tempder;
                }
                else
                {
                    tempder.raiz.izq = tempder;
                }
            }
            else
            {
                raiz = tempder; //si el padre es nulo, la nueva raiz es el nodo rotado
            }
            return(tempder);
        }
示例#2
0
        }                   //constructor sin parametros para el webservice

        public nodoavl(usuario user_)
        {
            user  = user_;
            nick  = user_.getnick();
            pass  = user_.getpass();
            email = user_.email;

            raiz = null;
            izq  = null;
            der  = null;
        }
示例#3
0
 public void insertar(usuario nuevouser, nodoavl nodo)
 {
     if (nodo == null)
     {
         if (raiz == null)
         {
             raiz = new nodoavl(nuevouser);//crear nueva raiz
             cont++;
         }
         else
         {
             insertar(nuevouser, raiz); //insertar a partir de la raiz
         }
     }
     else
     {
         //el nodo va a la rama izquierda
         if (String.Compare(nodo.nick, nuevouser.getnick()) > 0)
         {
             if (nodo.izq == null)
             {
                 nodo.izq      = new nodoavl(nuevouser);
                 nodo.izq.raiz = nodo;
                 rotacion(nodo.izq);//realizar balanceo
                 cont++;
             }
             else
             {
                 insertar(nuevouser, nodo.izq);
             }
         }
         //el nodo va a la rama derecha
         else if (String.Compare(nodo.nick, nuevouser.getnick()) < 0)
         {
             if (nodo.der == null)
             {
                 nodo.der      = new nodoavl(nuevouser);
                 nodo.der.raiz = nodo;
                 rotacion(nodo.der);//realizar balanceo
                 cont++;
             }
             else
             {
                 insertar(nuevouser, nodo.der);
             }
         }
     }
 }
示例#4
0
        public String graficar(avl arbol)
        {
            String dotgraph = "Digraph contactos {\nRankdir=TD\nnode [shape =circle]\n";

            if (arbol != null)
            {
                nodoavl temp = arbol.raiz;
                if (temp != null)
                {
                    dotgraph += agregarnodos(temp);
                }
            }

            dotgraph += "}";           //finalizar grafo

            return(guardar(dotgraph)); //retornar la dirección de la imagen
        }
示例#5
0
        public String agregarnodos(nodoavl user)
        {
            String salida = "";

            if (user != null)
            {
                salida += user.nick + " [label=\"Usuario: " + user.nick + "\nContraseña: " + user.pass + "\nemail: " + user.email + "\"];\n";
                if (user.izq != null)
                {
                    salida += agregarnodos(user.izq);
                    salida += user.nick + " -> " + user.izq.nick + ";\n";
                }
                if (user.der != null)
                {
                    salida += agregarnodos(user.der);
                    salida += user.nick + " -> " + user.der.nick + ";\n";
                }
            }
            return(salida);
        }
示例#6
0
 public avl()
 {
     raiz = null; cont = 0;
 }
示例#7
0
        public void rotacion(nodoavl nodo)
        {
            int balance = nodo.fe(); //obtener factor de equilibrio

            if (balance > 1)         //el factor de equilibrio es 2 o más, el peso es por la derecha
            {
                if (nodo.der != null)
                {
                    if (nodo.der.fe() >= 0)
                    {
                        nodoavl rotado = giroizq(nodo);//realizar rotación izquierda
                        if (rotado.raiz != null)
                        {
                            rotacion(rotado.raiz);                     //continuar con la rotación hacia la raíz
                        }
                    }
                    else if (nodo.der.fe() < 0)         //realizar rotación doble por la derecha y luego por la izquierda
                    {
                        giroder(nodo.der);              //realizar rotación derecha con el nodo derecho
                        nodoavl rotado = giroizq(nodo); //realizar rotación izquierda con el nodo
                        if (rotado.raiz != null)
                        {
                            rotacion(rotado.raiz);                     //continuar con la rotación hacia la raíz
                        }
                    }
                }

                //else no se hace rotación porque el nodo esá balanceado
            }
            else if (balance < -1)//el factor de equilibrio es -2 o menos, el peso es por la izquierda
            {
                if (nodo.izq != null)
                {
                    if (nodo.izq.fe() <= 0)
                    {
                        nodoavl rotado = giroder(nodo);//realizar rotación derecha
                        if (rotado.raiz != null)
                        {
                            rotacion(rotado.raiz);                     //continuar con la rotación hacia la raíz
                        }
                    }
                    else if (nodo.izq.fe() > 0)         //realizar rotación doble por la izquierda y luego por la derecha
                    {
                        giroizq(nodo.izq);              //realizar rotación izquierda con el nodo izquierdo
                        nodoavl rotado = giroder(nodo); //realizar rotación derecha con el nodo
                        if (rotado.raiz != null)
                        {
                            rotacion(rotado.raiz);                     //continuar con la rotación hacia la raíz
                        }
                    }
                }
                //else no se hace rotación porque el nodo esá balanceado
            }
            else
            {
                if (nodo.raiz != null)
                {
                    rotacion(nodo.raiz);                   //continuar con la rotacion hacia la raiz
                }
            }
        }