예제 #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 nodo Insertar(nodo raizSub, comparador dato)
 {
     if (raizSub == null)
     {
         raizSub = new nodo(dato);
     }
     else if (dato.menorIgualQue(raizSub.valorNodo()))
     {
         nodo iz;
         iz = Insertar(raizSub.subarbolIzquierdo(), dato);
         raizSub.ramaIzda(iz);
     }
     else if (dato.mayorQue(raizSub.valorNodo()))
     {
         nodo dr;
         dr = Insertar(raizSub.subarbolDerecho(), dato);
         raizSub.ramaDcho(dr);
     }
     return(raizSub);
 }
예제 #3
0
 private nodo eliminar(nodo raizSub, comparador dato)
 {
     if (raizSub == null)
     {
         throw new Exception("No hay nodo para eliminar");
     }
     else if (dato.menorQue(raizSub.valorNodo()))
     {
         nodo iz;
         iz = eliminar(raizSub.subarbolIzquierdo(), dato);
         raiz.ramaIzda(iz);
     }
     else if (dato.mayorQue(raizSub.valorNodo()))
     {
         nodo dr;
         dr = eliminar(raizSub.subarbolDerecho(), dato);
         raizSub.ramaDcho(dr);
     }
     else //Nodo encontrado
     {
         nodo q;
         q = raizSub;
         if (q.subarbolIzquierdo() == null)
         {
             raizSub = q.subarbolDerecho();
         }
         else if (q.subarbolDerecho() == null)
         {
             raizSub = q.subarbolIzquierdo();
         }
         else //tiene rama ezquierda y derecha
         {
             q = reemplazar(q);
         }
         q = null;
     }
     return(raizSub);
 }
예제 #4
0
        private NodoAvl insertarDatoAvl(NodoAvl objRaizAvl, comparador nuevoDato, Logical objLogico)
        //throws Exception
        {
            NodoAvl n1;

            if (objRaizAvl == null)
            {
                objRaizAvl = new NodoAvl(nuevoDato);
                objLogico.setLogical(true);
            }
            else if (nuevoDato.menorQue(objRaizAvl.valorNodo()))
            {
                NodoAvl iz;
                iz = insertarDatoAvl((NodoAvl)objRaizAvl.subArbolIzdo(), nuevoDato, objLogico);
                objRaizAvl.ramaIzdo(iz);
                // regreso por los nodos del camino de búsqueda
                if (objLogico.booleanValue())
                {
                    // decrementa el fe por aumentar la altura de rama izquierda
                    switch (objRaizAvl.fe)
                    {
                    case 1:
                        objRaizAvl.fe = 0;
                        objLogico.setLogical(false);
                        break;

                    case 0:
                        objRaizAvl.fe = -1;
                        break;

                    case -1:     // aplicar rotación a la izquierda
                        n1 = (NodoAvl)objRaizAvl.subArbolIzdo();
                        if (n1.fe == -1)
                        {
                            objRaizAvl = rotacionII(objRaizAvl, n1);
                        }
                        else
                        {
                            objRaizAvl = rotacionID(objRaizAvl, n1);
                        }
                        objLogico.setLogical(false);
                        break;
                    }
                }
            }
            else if (nuevoDato.mayorQue(objRaizAvl.valorNodo()))
            {
                NodoAvl dr;
                dr = insertarDatoAvl((NodoAvl)objRaizAvl.subArbolDrcho(), nuevoDato, objLogico);
                objRaizAvl.ramaDcho(dr);
                // regreso por los nodos del camino de búsqueda
                if (objLogico.booleanValue())
                {
                    // incrementa el fe por aumentar la altura de rama izquierda
                    switch (objRaizAvl.fe)
                    {
                    case 1:     // aplicar rotación a la derecha
                        n1 = (NodoAvl)objRaizAvl.subArbolDrcho();
                        if (n1.fe == +1)
                        {
                            objRaizAvl = rotacionDD(objRaizAvl, n1);
                        }
                        else
                        {
                            objRaizAvl = rotacionDI(objRaizAvl, n1);
                        }
                        objLogico.setLogical(false);
                        break;

                    case 0:
                        objRaizAvl.fe = +1;
                        break;

                    case -1:
                        objRaizAvl.fe = 0;
                        objLogico.setLogical(false);
                        break;
                    }
                }
            }
            else
            {
                throw new Exception("No puede haber claves repetidas ");
            }
            return(objRaizAvl);
        }