private nodoB <TKey, TData> SearchRecursive(nodoB <TKey, TData> currentnodoB, TKey key)
 {
     if (currentnodoB.nodoLlaves.Exists(x => key.CompareTo(x) == 0))
     {
         return(currentnodoB);
     }
     else
     {
         int index = currentnodoB.posicionAproximada(key);
         if (currentnodoB.obtenerNodoIndice(index) == Generador.hacerNulo())
         {
             return(null);
         }
         return(SearchRecursive(AccessTonodoB(currentnodoB.Hijos[index]), key));
     }
 }
 private nodoB <TKey, TData> InsertPop(nodoB <TKey, TData> Actual, TData DataPop, TKey KeyPop, int posicionI)
 {
     if (Actual.estaLleno())
     {
         Actual.insertar(KeyPop, DataPop);
         DataPop = Actual.nivelSuperior(ref KeyPop);
         nodoB <TKey, TData> Hermano = NewnodoB();
         nodoB <TKey, TData> Padre   = AccessTonodoB(Actual.Padre);
         Hermano.Padre = Actual.Padre;
         actaulizarNodo(Hermano);
         actaulizarNodo(Actual);
         if (Padre == null)
         {
             nodoB <TKey, TData> newRaiz = NewnodoB();
             newRaiz.insertar(KeyPop, DataPop);
             newRaiz.insertarHijos(0, Actual.posicionPrincipal);
             newRaiz.insertarHijos(1, Hermano.posicionPrincipal);
             Raiz          = newRaiz;
             Actual.Padre  = newRaiz.posicionPrincipal;
             Hermano.Padre = newRaiz.posicionPrincipal;
             actaulizarNodo(Raiz);
             actaulizarNodo(Actual);
             actaulizarNodo(Hermano);
             Altura++;
             if (posicionI < 0)
             {
                 List <int>   leftSon = new List <int>();
                 List <TData> nData   = new List <TData>();
                 Hermano.nodoLlaves = Actual.HijosAndValuesToBrother(KeyPop, ref nData, ref leftSon);
                 Hermano.datosNodo  = nData;
                 actualizarGrupoHijos(Actual, Actual.Hijos);
                 actualizarGrupoHijos(Hermano, leftSon);
                 actaulizarNodo(Actual);
                 actaulizarNodo(Hermano);
                 return(Actual);
             }
             else
             {
                 List <int>   leftSon = new List <int>();
                 List <TData> nData   = new List <TData>();
                 Hermano.nodoLlaves = Actual.hijosyvaloresActuales(KeyPop, ref nData, ref leftSon);
                 Hermano.datosNodo  = nData;
                 actualizarGrupoHijos(Actual, Actual.Hijos);
                 actualizarGrupoHijos(Hermano, leftSon);
                 actaulizarNodo(Actual);
                 actaulizarNodo(Hermano);
                 return(Hermano);
             }
         }
         else
         {
             List <int>          leftSon     = new List <int>();
             List <TData>        nData       = new List <TData>();
             nodoB <TKey, TData> auxPadre    = InsertPop(Padre, DataPop, KeyPop, posicionPrincipal(Padre, KeyPop));
             int aproximateposicionPrincipal = auxPadre.posicionAproximada(KeyPop);
             auxPadre.insertarHijos(aproximateposicionPrincipal, Hermano.posicionPrincipal);
             Hermano.Padre = auxPadre.posicionPrincipal;
             Actual        = AccessTonodoB(Actual.posicionPrincipal);
             Padre         = AccessTonodoB(Padre.posicionPrincipal);
             if (posicionI < 0)
             {
                 Hermano.nodoLlaves = Actual.HijosAndValuesToBrother(KeyPop, ref nData, ref leftSon);
                 Hermano.datosNodo  = nData;
                 actualizarGrupoHijos(Hermano, leftSon);
                 actaulizarNodo(auxPadre);
                 actaulizarNodo(Actual);
                 actaulizarNodo(Hermano);
                 actaulizarNodo(Padre);
                 actualizarGrupoHijos(Padre, Padre.Hijos);
                 actualizarGrupoHijos(auxPadre, auxPadre.Hijos);
                 return(Actual);
             }
             else if (posicionI > 0)
             {
                 Hermano.nodoLlaves = Actual.hijosyvaloresActuales(KeyPop, ref nData, ref leftSon);
                 Hermano.datosNodo  = nData;
                 actualizarGrupoHijos(Hermano, leftSon);
                 Hermano.Padre = auxPadre.posicionPrincipal;
                 actaulizarNodo(auxPadre);
                 actaulizarNodo(Actual);
                 actaulizarNodo(Hermano);
                 actaulizarNodo(Padre);
                 actualizarGrupoHijos(Padre, Padre.Hijos);
                 actualizarGrupoHijos(auxPadre, auxPadre.Hijos);
                 auxPadre = AccessTonodoB(auxPadre.posicionPrincipal);
                 Actual   = AccessTonodoB(Actual.posicionPrincipal);
                 Hermano  = AccessTonodoB(Hermano.posicionPrincipal);
                 Padre    = AccessTonodoB(Padre.posicionPrincipal);
                 return(Hermano);
             }
             else
             {
                 Hermano.nodoLlaves = Actual.hijosyvaloresActuales(KeyPop, ref nData, ref leftSon);
                 Hermano.datosNodo  = nData;
                 actualizarGrupoHijos(Hermano, leftSon);
                 actaulizarNodo(auxPadre);
                 actaulizarNodo(Actual);
                 actaulizarNodo(Hermano);
                 actaulizarNodo(Padre);
                 actualizarGrupoHijos(Padre, Padre.Hijos);
                 actualizarGrupoHijos(auxPadre, auxPadre.Hijos);
                 return(Hermano);
             }
         }
     }
     else
     {
         Actual.insertar(KeyPop, DataPop);
         actaulizarNodo(Actual);
         if (Actual.posicionPrincipal == Raiz.posicionPrincipal)
         {
             Raiz = Actual;
         }
         return(Actual);
     }
 }