//método interno para realizar la operación
    protected Nodo insertar(Nodo raizSub, Comparador dato)    //COMO PARAMETROS RAIZ Y COMPARADOR
    {
        if (raizSub == null)
        {
            raizSub = new Nodo(dato); //Si es nulo no hay nada que comparar

            //Si el dato es menor le decimos que lo inserte a la izquierda
        }
        else if (dato.menorQue(raizSub.valorNodo()))          //SI ES MENOR QUE
        {
            Nodo iz;                                          //Variable para nodo izquierdo
            iz = insertar(raizSub.subarbolIzquierdo(), dato); //Insertando hacia la rama izquierda
            raizSub.ramaIzdo(iz);                             //Tirandolo para la rama izquierda

            //Si el dato es menor le decimos que lo inserte a la derecha
        }
        else if (dato.mayorQue(raizSub.valorNodo()))        //SI ES MAYOR QUE
        {
            Nodo dr;                                        //Variable para nodo derecho
            dr = insertar(raizSub.subarbolDerecho(), dato); //Insertando hacia la rama derecha
            raizSub.ramaDcho(dr);                           //Tirandolo para la rama derecha
        }
        else
        {
            // throw new Exception("Nodo duplicado");
            Console.WriteLine($"duplicado!!!! {raizSub.valorNodo()}");
        }
        return(raizSub); //Retornando la raiz del subarbol
    }
예제 #2
0
        //método interno para realizar la operación

        private Nodo insertar(Nodo raizSub, Comparador dato)
        {
            if (raizSub == null)
            {
                raizSub = new Nodo(dato);
            }
            else if (dato.menorQue(raizSub.valorNodo()))
            {
                Nodo iz;
                iz = insertar(raizSub.subarbolIzquierdo(), dato);
                raizSub.ramaIzdo(iz);
            }
            else if (dato.mayorQue(raizSub.valorNodo()))
            {
                Nodo dr;
                dr = insertar(raizSub.subarbolDerecho(), dato);
                raizSub.ramaDcho(dr);
            }
            else
            {
                // throw new Exception("Nodo duplicado");
                Console.WriteLine($"duplicado!!!! {raizSub.valorNodo()}");
            }
            return(raizSub);
        }
예제 #3
0
 private NodoAvl borrarAvl(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 = borrarAvl((NodoAvl)r.subarbolIzdo(), clave, cambiaAltura);
         r.ramaIzdo(iz);
         if (cambiaAltura.booleanValue())
         {
             r = equilibrar1(r, cambiaAltura);
         }
     }
     else if (clave.mayorQue(r.valorNodo()))
     {
         NodoAvl dr;
         dr = borrarAvl((NodoAvl)r.subarbolDcho(), 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.subarbolDcho();
             cambiaAltura.setLogical(true);
         }
         else if (q.subarbolDcho() == null)
         {
             r = (NodoAvl)q.subarbolIzdo();
             cambiaAltura.setLogical(true);
         }
         else
         { // tiene rama izquierda y derecha
             NodoAvl iz;
             iz = reemplazar(r, (NodoAvl)r.subarbolIzdo(), cambiaAltura);
             r.ramaIzdo(iz);
             if (cambiaAltura.booleanValue())
             {
                 r = equilibrar1(r, cambiaAltura);
             }
         }
         q = null;
     }
     return(r);
 }
예제 #4
0
        protected Nodo eliminar(Nodo raizSub, Comparador dato)
        {
            if (raizSub == null)
            {
                throw new Exception("No hay nod para eliminar");
            }
            else if (dato.mayorQue(raizSub.valorNodo()))
            {
                Nodo iz;
                iz = eliminar(raizSub.subarbolIzquierdo(), dato);
                raizSub.ramaIzquierda(iz);
            }
            else if (dato.mayorQue(raizSub.valorNodo()))
            {
                Nodo dr;
                dr = eliminar(raizSub.subarbolDerecho(), dato);
                raizSub.ramaDerecha(dr);
            }
            else
            {
                Nodo q;
                q = raizSub;
                if (q.subarbolIzquierdo() == null)
                {
                    raizSub = q.subarbolDerecho();
                }

                else if (q.subarbolDerecho() == null)
                {
                    raizSub = q.subarbolIzquierdo();
                }
                else
                {
                    q = reemplazar(q);
                }
                q = null;
            }
            return(raizSub);
        }
//método interno para realizar la operación

    protected Nodo eliminar(Nodo raizSub, Comparador dato)    //Enviamos como parametro raizSub y dato
    {
        if (raizSub == null)
        {
            throw new Exception("No encontrado el nodo con la clave"); //Si es nulo no hay nada que eliminar y lanzamos una excepcion

            //Si el dato es menor que
        }
        else if (dato.menorQue(raizSub.valorNodo()))
        {
            Nodo iz;
            iz = eliminar(raizSub.subarbolIzquierdo(), dato);  //Eliminamos la rama izquierda
            raizSub.ramaIzdo(iz);

            //Si el dato es mayor que
        }
        else if (dato.mayorQue(raizSub.valorNodo()))
        {
            Nodo dr;
            dr = eliminar(raizSub.subarbolDerecho(), dato); //Eliminamos la rama derecha
            raizSub.ramaDcho(dr);
        }
        else   // Nodo encontrado
        {
            Nodo q;
            q = raizSub;                          // nodo a quitar del árbol
            if (q.subarbolIzquierdo() == null)    //Si no tiene valor en la izquierda
            {
                raizSub = q.subarbolDerecho();    //Agarramos la derecha
            }
            else if (q.subarbolDerecho() == null) //Si no tiene valor en la derecha
            {
                raizSub = q.subarbolIzquierdo();  //Agarramos el izquierda

                //Si ninguno es nulo
            }
            else                   // tiene rama izquierda y derecha
            {
                q = reemplazar(q); //Lo reemplazamos
            }
            q = null;              //De lo contrario q es igual a nulo
        }
        return(raizSub);
    }
 protected 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.ramaIzquierda(iz);
     }
     else if (dato.mayorQue(raizSub.valorNodo()))
     {
         Nodo dr;
         dr = insertar(raizSub.subarbolDerecho(), dato);
         raizSub.ramaDerecha(dr);
     }
     return(raizSub);
 }//ef
예제 #7
0
        public Nodo getNodo(Object n, Comparador cmp)
        {
            Nodo raizTmp = tree.raizArbol();

            if (tree.esVacio())
            {
                return(null);
            }
            while (raizTmp.subarbolDcho() != null || raizTmp.subarbolIzdo() != null)
            {
                if (cmp.mayorQue(n))
                {
                    if (raizTmp.subarbolDcho() != null)
                    {
                        raizTmp = raizTmp.subarbolDcho();
                    }
                    else
                    {
                        return(null);
                    }
                }
                else
                {
                    if (raizTmp.subarbolIzdo() != null)
                    {
                        raizTmp = raizTmp.subarbolIzdo();
                    }
                    else
                    {
                        return(null);
                    }
                }
                if (cmp.igualQue(n))
                {
                    return(raizTmp);
                }
            }
            return(raizTmp);
        }
 //método interno para realizar la operación
 protected Nodo eliminar(Nodo raizSub, Comparador dato)
 {
     if (raizSub == null)
     {
         throw new Exception("No encontrado el nodo con la clave");
     }
     else if (dato.menorQue(raizSub.valorNodo()))
     {
         Nodo iz;
         iz = eliminar(raizSub.subarbolIzdo(), dato);
         raizSub.ramaIzdo(iz);
     }
     else if (dato.mayorQue(raizSub.valorNodo()))
     {
         Nodo dr;
         dr = eliminar(raizSub.subarbolDcho(), dato);
         raizSub.ramaDcho(dr);
     }
     else     // Nodo encontrado
     {
         Nodo q;
         q = raizSub;     // nodo a quitar del árbol
         if (q.subarbolIzdo() == null)
         {
             raizSub = q.subarbolDcho();
         }
         else if (q.subarbolDcho() == null)
         {
             raizSub = q.subarbolIzdo();
         }
         else
         {     // tiene rama izquierda y derecha
             q = reemplazar(q);
         }
         q = null;
     }
     return(raizSub);
 }
 protected 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);
         raizSub.ramaIzquierda(iz);
     }
     else if (dato.mayorQue(raizSub.valorNodo()))
     {
         Nodo dr;
         dr = eliminar(raizSub.subarbolDerecho(), dato);
         raizSub.ramaDerecha(dr);
     }
     else//nodo encontrado
     {
         Nodo q;
         q = raizSub; //este es eo nodo que se quita del arbol
         if (q.subarbolIzquierdo() == null)
         {
             raizSub = q.subarbolDerecho();
         }
         else if (q.subarbolDerecho() == null)
         {
             raizSub = q.subarbolIzquierdo();
         }
         else  //tiene rama izquierda y derecha
         {
             q = reemplazar(q);
         }
         q = null;
     }
     return(raizSub);
 }
예제 #10
0
 protected 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);
         raizSub.ramaIzquierda(iz);
     }
     else if (dato.mayorQue(raizSub.valorNodo()))
     {
         nodo dr;
         dr = eliminar(raizSub.subarbolDerecho(), dato);
         raizSub.ramaDerecha(dr);
     }
     else
     {
         nodo q;
         q = raizSub; //este es el nodo que se quita del árbol
         if (q.subarbolIzquierdo() == null)
         {
             raizSub = q.subarbolDerecho();
         }
         else if (q.subarbolDerecho() == null)
         {
             raizSub = q.subarbolIzquierdo();
         }
         else// tiene rama izquierda y derecha
         {
             q = reemplazar(q);
         }
         q = null;
     }
     return(raizSub);
 }//end eliminar
예제 #11
0
 //método interno para realizar la operación
 protected Nodo insertar(Nodo raizSub, Comparador dato)
 {
     if (raizSub == null)
     {
         raizSub = new Nodo(dato);
     }
     else if (dato.menorQue(raizSub.valorNodo()))
     {
         Nodo iz;
         iz = insertar(raizSub.subarbolIzdo(), dato);
         raizSub.ramaIzdo(iz);
     }
     else if (dato.mayorQue(raizSub.valorNodo()))
     {
         Nodo dr;
         dr = insertar(raizSub.subarbolDcho(), dato);
         raizSub.ramaDcho(dr);
     }
     else
     {
         throw new Exception("Nodo duplicado");
     }
     return(raizSub);
 }
예제 #12
0
        private NodoAvl insertarAvl(NodoAvl raiz, Comparador dt, Logical h)
        //throws Exception
        {
            NodoAvl n1;

            if (raiz == null)
            {
                raiz = new NodoAvl(dt);
                h.setLogical(true);
            }
            else if (dt.menorQue(raiz.valorNodo()))
            {
                NodoAvl iz;
                iz = insertarAvl((NodoAvl)raiz.subarbolIzdo(), dt, h);
                raiz.ramaIzdo(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.fe)
                    {
                    case 1:
                        raiz.fe = 0;
                        h.setLogical(false);
                        break;

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

                    case -1:     // aplicar rotación a la izquierda
                        n1 = (NodoAvl)raiz.subarbolIzdo();
                        if (n1.fe == -1)
                        {
                            raiz = rotacionII(raiz, n1);
                        }
                        else
                        {
                            raiz = rotacionID(raiz, n1);
                        }
                        h.setLogical(false);
                        break;
                    }
                }
            }
            else if (dt.mayorQue(raiz.valorNodo()))
            {
                NodoAvl dr;
                dr = insertarAvl((NodoAvl)raiz.subarbolDcho(), dt, h);
                raiz.ramaDcho(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.fe)
                    {
                    case 1:     // aplicar rotación a la derecha
                        n1 = (NodoAvl)raiz.subarbolDcho();
                        if (n1.fe == +1)
                        {
                            raiz = rotacionDD(raiz, n1);
                        }
                        else
                        {
                            raiz = rotacionDI(raiz, n1);
                        }
                        h.setLogical(false);
                        break;

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

                    case -1:
                        raiz.fe = 0;
                        h.setLogical(false);
                        break;
                    }
                }
            }
            else
            {
                throw new Exception("No puede haber claves repetidas ");
            }
            return(raiz);
        }
예제 #13
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);
        }
예제 #14
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);
        }