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