예제 #1
0
 private NodoAvl reemplazar(NodoAvl n, NodoAvl act, Logical cambiaAltura)
 {
     if (act.subarbolDcho() != null)
     {
         NodoAvl d;
         d = reemplazar(n, (NodoAvl)act.subarbolDcho(), cambiaAltura);
         act.ramaDcho(d);
         if (cambiaAltura.booleanValue())
         {
             act = equilibrar2(act, cambiaAltura);
         }
     }
     else
     {
         n.nuevoValor(act.valorNodo());
         n   = act;
         act = (NodoAvl)act.subarbolIzdo();
         n   = null;
         cambiaAltura.setLogical(true);
     }
     return(act);
 }
예제 #2
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
            {
                MessageBox.Show("Registro Exitoso");
            }
            return(raiz);
        }