private void PartirNodo(T H, nodoB <T> HDerecho, nodoB <T> Nodo, int A, ref T Mitad, ref nodoB <T> MitadDerecha)
        {
            int PosicionDeLaMitad;

            PosicionDeLaMitad = A;
            if (A <= Minimo)
            {
                A = Minimo;
            }
            else
            {
                A = Minimo + 1;
            }
            MitadDerecha = new nodoB <T>();
            for (int i = PosicionDeLaMitad + 1; i < Orden; i++)
            {
                MitadDerecha.Valores[i - PosicionDeLaMitad] = Nodo.Valores[i];
                MitadDerecha.Hijos[i - PosicionDeLaMitad]   = Nodo.Hijos[i];
            }
            MitadDerecha.Contador = Maximo - PosicionDeLaMitad;
            Nodo.Contador         = PosicionDeLaMitad;
            if (A <= Orden / 2)
            {
                InsertarEnHoja(H, HDerecho, Nodo, A);
            }
            else
            {
                var ValorNuevo = A - PosicionDeLaMitad;
                InsertarEnHoja(H, HDerecho, MitadDerecha, ValorNuevo);
            }
            Mitad = Nodo.Valores[Nodo.Contador];
            MitadDerecha.Hijos[0] = Nodo.Hijos[Nodo.Contador];
            Nodo.Contador         = Nodo.Contador - 1;
        }
 private void InsertarEnHoja(T H, nodoB <T> HDerecho, nodoB <T> Nodo, int A)
 {
     for (int i = Nodo.Contador; i >= A + 1; i--)
     {
         Nodo.Valores[i + 1] = Nodo.Valores[i];
         Nodo.Hijos[i + 1]   = Nodo.Hijos[i];
     }
     Nodo.Valores[A + 1] = H;
     Nodo.Hijos[A + 1]   = HDerecho;
     Nodo.Contador       = Nodo.Contador + 1;
 }
 private void Inorder(nodoB <T> Q)
 {
     if (!EstaVacio(Q))
     {
         Inorder(Q.Hijos[0]);
         for (int i = 1; i <= Q.Contador; i++)
         {
             Listado.Value.Add(Q.Valores[i]);
             Inorder(Q.Hijos[i]);
         }
     }
 }
 private void RecorridoInorder(nodoB <T> NodoArbol)
 {
     if (!EstaVacio(NodoArbol))
     {
         RecorridoInorder(NodoArbol.Hijos[0]);
         for (int i = 1; i < NodoArbol.Contador; i++)
         {
             Listado.Value.Add(NodoArbol.Valores[i]);
             RecorridoInorder(NodoArbol.Hijos[i]);
         }
     }
 }
 private void BusquedaNodo(T llave_valor, nodoB <T> nodoP, ref bool localizado, ref int ContAux)
 {
     if (Comparador(llave_valor, nodoP.Valores[1]) == -1)
     {
         localizado = false;
         ContAux    = 0;
     }
     else
     {
         ContAux = nodoP.Contador;
         while (Comparador(llave_valor, nodoP.Valores[ContAux]) == -1 && ContAux > 1)
         {
             ContAux   -= 1;
             localizado = (Comparador(llave_valor, nodoP.Valores[ContAux]) == 0);
         }
     }
 }
        private void Insertar(T AB, ref nodoB <T> Raiz)
        {
            var EmpujarHaciaArriba = default(bool);
            var Aux2 = default(nodoB <T>);
            var Aux  = default(T);

            Movilizar(AB, Raiz, ref EmpujarHaciaArriba, ref Aux, ref Aux2);
            if (EmpujarHaciaArriba)
            {
                var Z = new nodoB <T>();
                Z.Contador   = 1;
                Z.Valores[1] = Aux;
                Z.Hijos[0]   = Raiz;
                Z.Hijos[1]   = Aux2;
                Raiz         = Z;
            }
        }
 public void Busqueda(T Llave_valor, nodoB <T> Nodo_principal, ref bool Localizado, ref nodoB <T> Nodo_aux, ref int P)
 {
     if (EstaVacio(Nodo_principal))
     {
         Localizado = false;
     }
     else
     {
         BusquedaNodo(Llave_valor, Nodo_principal, ref Localizado, ref P);
         if (Localizado)
         {
             Nodo_aux = Nodo_principal;
         }
         else
         {
             Busqueda(Llave_valor, Nodo_principal.Hijos[P], ref Localizado, ref Nodo_aux, ref P);
         }
     }
 }
        private void Movilizar(T N, nodoB <T> M, ref bool SubirNodo, ref T O, ref nodoB <T> NuevaRaiz)
        {
            var Aux      = default(int);
            var SiAplica = default(bool);

            if (EstaVacio(M))
            {
                SubirNodo = true;
                O         = N;
                NuevaRaiz = null;
            }
            else
            {
                BusquedaNodo(N, M, ref SiAplica, ref Aux);

                if (SiAplica)
                {
                    return;
                }
                Movilizar(N, M.Hijos[Aux], ref SubirNodo, ref O, ref NuevaRaiz);

                if (SubirNodo)
                {
                    if (M.Contador < Maximo)
                    {
                        SubirNodo = false;
                        InsertarEnHoja(O, NuevaRaiz, M, Aux);
                    }
                    else
                    {
                        SubirNodo = true;
                        PartirNodo(O, NuevaRaiz, M, Aux, ref O, ref NuevaRaiz);
                    }
                }
            }
        }
 public static bool EstaVacio(nodoB <T> nuevoNodo)
 {
     return(nuevoNodo == null);
 }
 public nodoB()
 {
     Valores  = new T[5];
     Hijos    = new nodoB <T> [5];
     Contador = 0;
 }