Beispiel #1
0
 public NodoArbolAVL(Object valor, NodoArbolAVL izquierdo, NodoArbolAVL derecho)
 {
     this.valor             = valor;
     this.factor_equilibrio = 0;
     this.izquierdo         = izquierdo;
     this.derecho           = derecho;
 }
Beispiel #2
0
        private NodoArbolAVL equilibrar1(NodoArbolAVL n, Logical cambiaAltura)
        {
            NodoArbolAVL n1;

            switch (n.getFactorEquilibrio())
            {
            case -1:
                n.setFactorEquilibrio(0);
                break;

            case 0:
                n.setFactorEquilibrio(1);
                cambiaAltura.setLogical(false);
                break;

            case +1:     //se aplicar un tipo de rotación derecha
                n1 = (NodoArbolAVL)n.getDerecho();
                if (n1.getFactorEquilibrio() >= 0)
                {
                    if (n1.getFactorEquilibrio() == 0)     //la altura no vuelve a disminuir
                    {
                        cambiaAltura.setLogical(false);
                    }
                    n = rotacionDD(n, n1);
                }
                else
                {
                    n = rotacionDI(n, n1);
                }
                break;
            }
            return(n);
        }
Beispiel #3
0
        private NodoArbolAVL equilibrar2(NodoArbolAVL n, Logical cambiaAltura)
        {
            NodoArbolAVL n1;

            switch (n.getFactorEquilibrio())
            {
            case -1:     // Se aplica un tipo de rotación izquierda
                n1 = (NodoArbolAVL)n.getIzquierdo();
                if (n1.getFactorEquilibrio() <= 0)
                {
                    if (n1.getFactorEquilibrio() == 0)
                    {
                        cambiaAltura.setLogical(false);
                    }
                    n = rotacionII(n, n1);
                }
                else
                {
                    n = rotacionID(n, n1);
                }
                break;

            case 0:
                n.setFactorEquilibrio(-1);
                cambiaAltura.setLogical(false);
                break;

            case +1:
                n.setFactorEquilibrio(0);
                break;
            }
            return(n);
        }
Beispiel #4
0
        protected Object igualar(NodoArbolAVL raizSub, Object valor1, Object valor2)
        {
            if (raizSub == null)
            {
                return(null);
            }

            Comparador comparador;

            comparador = (Comparador)raizSub.getValor();

            if (comparador.igualar(valor1, valor2))
            {
                return(raizSub.getValor());
            }

            if (igualar(raizSub.getIzquierdo(), valor1, valor2) != null)
            {
                return(igualar(raizSub.getIzquierdo(), valor1, valor2));
            }
            else
            {
                return(igualar(raizSub.getDerecho(), valor1, valor2));
            }
        }
Beispiel #5
0
        public void insertar(Object valor)//throws Exception
        {
            Comparador dato;
            Logical    h = new Logical(false); // intercambia un valor booleano

            dato      = (Comparador)valor;
            this.raiz = insertarAvl(this.raiz, dato, h);
        }
Beispiel #6
0
 // Recorrido de un árbol binario en postorden
 public static string postorden(NodoArbolAVL r)
 {
     if (r != null)
     {
         return(postorden(r.getIzquierdo()) + postorden(r.getDerecho()) + r.visitar());
     }
     return("");
 }
Beispiel #7
0
        public void eliminar(Object valor) //throws Exception
        {
            Comparador dato;

            dato = (Comparador)valor;
            Logical flag = new Logical(false);

            raiz = borrarAvl(raiz, dato, flag);
        }
Beispiel #8
0
 private NodoArbolAVL borrarAvl(NodoArbolAVL r, Comparador clave, Logical cambiaAltura) //throws Exception
 {
     if (r == null)
     {
         throw new Exception(" Nodo no encontrado ");
     }
     else if (clave.menorQue(r.getValor()))
     {
         NodoArbolAVL iz;
         iz = borrarAvl((NodoArbolAVL)r.getIzquierdo(), clave, cambiaAltura);
         r.setIzquierdo(iz);
         if (cambiaAltura.booleanValue())
         {
             r = equilibrar1(r, cambiaAltura);
         }
     }
     else if (clave.mayorQue(r.getValor()))
     {
         NodoArbolAVL dr;
         dr = borrarAvl((NodoArbolAVL)r.getDerecho(), clave, cambiaAltura);
         r.setDerecho(dr);
         if (cambiaAltura.booleanValue())
         {
             r = equilibrar2(r, cambiaAltura);
         }
     }
     else // Nodo encontrado
     {
         NodoArbolAVL q;
         q = r; // nodo a quitar del árbol
         if (q.getIzquierdo() == null)
         {
             r = (NodoArbolAVL)q.getDerecho();
             cambiaAltura.setLogical(true);
         }
         else if (q.getDerecho() == null)
         {
             r = (NodoArbolAVL)q.getIzquierdo();
             cambiaAltura.setLogical(true);
         }
         else
         { // tiene rama izquierda y derecha
             NodoArbolAVL iz;
             iz = reemplazar(r, (NodoArbolAVL)r.getIzquierdo(), cambiaAltura);
             r.setIzquierdo(iz);
             if (cambiaAltura.booleanValue())
             {
                 r = equilibrar1(r, cambiaAltura);
             }
         }
         q = null;
     }
     return(r);
 }
Beispiel #9
0
 //Obtener el nodo mayor.
 public Object getMayor(NodoArbolAVL r)
 {
     if (r.getDerecho() != null)
     {
         return(getMayor(r.getDerecho()));
     }
     else
     {
         return(r.getValor());
     }
 }
Beispiel #10
0
 //Devuelve el número de nodos que tiene el árbol
 public static int numNodos(NodoArbolAVL raiz)
 {
     if (raiz == null)
     {
         return(0);
     }
     else
     {
         return(1 + numNodos(raiz.getIzquierdo()) +
                numNodos(raiz.getDerecho()));
     }
 }
Beispiel #11
0
 private NodoArbolAVL reemplazar(NodoArbolAVL n, NodoArbolAVL act, Logical cambiaAltura)
 {
     if (act.getDerecho() != null)
     {
         NodoArbolAVL d;
         d = reemplazar(n, (NodoArbolAVL)act.getDerecho(), cambiaAltura);
         act.setDerecho(d);
         if (cambiaAltura.booleanValue())
         {
             act = equilibrar2(act, cambiaAltura);
         }
     }
     else
     {
         n.setValor(act.getValor());
         n   = act;
         act = (NodoArbolAVL)act.getIzquierdo();
         n   = null;
         cambiaAltura.setLogical(true);
     }
     return(act);
 }
Beispiel #12
0
        private NodoArbolAVL rotacionDD(NodoArbolAVL nodo, NodoArbolAVL nodo2)
        {
            nodo.setDerecho(nodo2.getIzquierdo());
            nodo2.setIzquierdo(nodo);

            using (StreamWriter w = File.AppendText("C:\\Users\\kyone\\Desktop" + "/Bitacora.txt"))
            {
                w.WriteLine("Factor de equilibrio = " + (nodo.getFactorEquilibrio() + nodo2.getFactorEquilibrio()) + "; Nodos en la rotación = " + nodo.getValor().ToString() + ", " + nodo2.getValor().ToString() + "; Rotación DD");
            }
            // actualización de los factores de equilibrio
            if (nodo2.getFactorEquilibrio() == +1) // se cumple en la inserción
            {
                nodo.setFactorEquilibrio(0);
                nodo2.setFactorEquilibrio(0);
            }
            else
            {
                nodo.setFactorEquilibrio(+1);
                nodo2.setFactorEquilibrio(+1);
            }

            return(nodo2);
        }
Beispiel #13
0
 public void setDerecho(NodoArbolAVL derecho)
 {
     this.derecho = derecho;
 }
Beispiel #14
0
 public ArbolAVL()
 {
     this.raiz = null;
 }
Beispiel #15
0
 public ArbolAVL(Object valor)
 {
     this.raiz = new NodoArbolAVL(valor);
 }
Beispiel #16
0
 public void setIzquierdo(NodoArbolAVL izquierdo)
 {
     this.izquierdo = izquierdo;
 }
Beispiel #17
0
 public NodoArbolAVL(Object valor)
 {
     this.valor             = valor;
     this.factor_equilibrio = 0;
     this.izquierdo         = this.derecho = null;
 }
Beispiel #18
0
        private NodoArbolAVL insertarAvl(NodoArbolAVL raiz, Comparador dt, Logical h)
        {
            NodoArbolAVL n1;

            if (raiz == null)
            {
                raiz = new NodoArbolAVL(dt);
                h.setLogical(true);
            }
            else if (dt.menorQue(raiz.getValor()))
            {
                NodoArbolAVL iz;
                iz = insertarAvl((NodoArbolAVL)raiz.getIzquierdo(), dt, h);
                raiz.setIzquierdo(iz);
                // regreso por los nodos del camino de búsqueda
                if (h.booleanValue())
                {
                    // decrementa el fe por aumentar la altura de rama izquierda
                    switch (raiz.getFactorEquilibrio())
                    {
                    case 1:
                        raiz.setFactorEquilibrio(0);
                        h.setLogical(false);
                        break;

                    case 0:
                        raiz.setFactorEquilibrio(-1);
                        break;

                    case -1:     // aplicar rotación a la izquierda
                        n1 = (NodoArbolAVL)raiz.getIzquierdo();
                        if (n1.getFactorEquilibrio() == -1)
                        {
                            raiz = rotacionII(raiz, n1);
                        }
                        else
                        {
                            raiz = rotacionID(raiz, n1);
                        }
                        h.setLogical(false);
                        break;
                    }
                }
            }
            else if (dt.mayorQue(raiz.getValor()))
            {
                NodoArbolAVL dr;
                dr = insertarAvl((NodoArbolAVL)raiz.getDerecho(), dt, h);
                raiz.setDerecho(dr);
                // regreso por los nodos del camino de búsqueda
                if (h.booleanValue())
                {
                    // incrementa el fe por aumentar la altura de rama izquierda
                    switch (raiz.getFactorEquilibrio())
                    {
                    case 1:     // aplicar rotación a la derecha
                        n1 = (NodoArbolAVL)raiz.getDerecho();
                        if (n1.getFactorEquilibrio() == +1)
                        {
                            raiz = rotacionDD(raiz, n1);
                        }
                        else
                        {
                            raiz = rotacionDI(raiz, n1);
                        }
                        h.setLogical(false);
                        break;

                    case 0:
                        raiz.setFactorEquilibrio(+1);
                        break;

                    case -1:
                        raiz.setFactorEquilibrio(0);
                        h.setLogical(false);
                        break;
                    }
                }
            }
            else
            {
                throw new Exception("No puede haber claves repetidas ");
            }
            return(raiz);
        }