예제 #1
0
 private NodoAvl eliminarDatoAvl(NodoAvl r, Comparador clave,
                                 Logical cambiaAltura) //throws Exception
 {
     if (r == null)
     {
         throw new Exception(" Nodo no encontrado ");
     }
     else if (clave.menorQue(r.valorNodo()))
     {
         NodoAvl iz;
         iz = eliminarDatoAvl((NodoAvl)r.subArbolIzdo(), clave, cambiaAltura);
         r.ramaIzdo(iz);
         if (cambiaAltura.booleanValue())
         {
             r = equilibrar1(r, cambiaAltura);
         }
     }
     else if (clave.mayorQue(r.valorNodo()))
     {
         NodoAvl dr;
         dr = eliminarDatoAvl((NodoAvl)r.subArbolDrcho(), clave, cambiaAltura);
         r.ramaDcho(dr);
         if (cambiaAltura.booleanValue())
         {
             r = equilibrar2(r, cambiaAltura);
         }
     }
     else // Nodo encontrado
     {
         NodoAvl q;
         q = r; // nodo a quitar del árbol
         if (q.subArbolIzdo() == null)
         {
             r = (NodoAvl)q.subArbolDrcho();
             cambiaAltura.setLogical(true);
         }
         else if (q.subArbolDrcho() == null)
         {
             r = (NodoAvl)q.subArbolIzdo();
             cambiaAltura.setLogical(true);
         }
         else
         { // tiene rama izquierda y derecha
             NodoAvl iz;
             iz = reemplazarAvl(r, (NodoAvl)r.subArbolIzdo(), cambiaAltura);
             r.ramaIzdo(iz);
             if (cambiaAltura.booleanValue())
             {
                 r = equilibrar1(r, cambiaAltura);
             }
         }
         q = null;
     }
     return(r);
 }
예제 #2
0
        private NodoAvl rotacionDI(NodoAvl nodo0, NodoAvl nodo1)
        {
            NodoAvl n2;

            n2 = (NodoAvl)nodo1.subArbolIzdo();
            nodo0.ramaDcho(n2.subArbolIzdo());
            n2.ramaIzdo(nodo0);
            nodo1.ramaIzdo(n2.subArbolDrcho());
            n2.ramaDcho(nodo1);
            // actualización de los factores de equilibrio
            if (n2.fe == +1)
            {
                nodo0.fe = -1;
            }
            else
            {
                nodo0.fe = 0;
            }
            if (n2.fe == -1)
            {
                nodo1.fe = 1;
            }
            else
            {
                nodo1.fe = 0;
            }
            n2.fe = 0;
            return(n2);
        }
예제 #3
0
 private NodoAvl rotacionDD(NodoAvl nodo0, NodoAvl nodo1)
 {
     nodo0.ramaDcho(nodo1.subArbolIzdo());
     nodo1.ramaIzdo(nodo0);
     // actualización de los factores de equilibrio
     if (nodo1.fe == +1) // se cumple en la inserción
     {
         nodo0.fe = 0;
         nodo1.fe = 0;
     }
     else
     {
         nodo0.fe = +1;
         nodo1.fe = -1;
     }
     return(nodo1);
 }