예제 #1
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);
 }
예제 #2
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);
 }
예제 #3
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);
        }