public void CompartirHaciaLaIzquierda(NodoProducto Sharing, int[] IndiceHermano, Producto Nuevo)
            {
                var padre            = SeekPadre(Sharing.Padre);
                var HermanoIzquierdo = SeekHijo(IndiceHermano[0]);

                var listaactual = Sharing.Datos.ToList <Producto>();

                listaactual.Add(Nuevo);
                listaactual.Sort((x, y) => x.Nombre.CompareTo(y.Nombre));
                var datoBaja = padre.Datos[Indice(padre, Nuevo) - 1];
                var sube     = listaactual[0];

                listaactual.Remove(listaactual[0]);
                Sharing.Datos = listaactual.ToArray();
                padre.Datos[Indice(padre, Nuevo) - 1] = sube;
                for (int i = 0; i < HermanoIzquierdo.Datos.Length; i++)
                {
                    if (HermanoIzquierdo.Datos[i] == null)
                    {
                        HermanoIzquierdo.Datos[i] = datoBaja;
                        break;
                    }
                }
                EscribirHijo(Sharing.id, Sharing);
                EscribirHijo(HermanoIzquierdo.id, HermanoIzquierdo);
                EscribirPadre(padre.id, padre);
            }
            public void CompartirDato(NodoProducto Actual, Producto Nuevo)
            {
                var padre                   = SeekPadre(Actual.Padre);
                var IndicesHijos            = new List <int>();
                var indiceDelHijoACompartir = 0;

                //llenar lista de hijos disponibles
                foreach (var indicehijo in padre.Hijos)
                {
                    if (indicehijo == 0)
                    {
                        break;
                    }
                    else
                    {
                        IndicesHijos.Add(indicehijo);
                    }
                }
                IndicesHijos.ToArray();
                // encuentra el indice en el arreglo de hijos
                foreach (var item in IndicesHijos)
                {
                    if (item == Actual.id)
                    {
                        break;
                    }
                    else
                    {
                        indiceDelHijoACompartir++;
                    }
                }
                // izquierda


                var indiceizquierda = indiceDelHijoACompartir - 1;
                var indiceDerecha   = indiceDelHijoACompartir + 1;
                var caminoDerecha   = new List <int>();
                var caminoIzquierda = new List <int>();
                var intercambiado   = true;

                if (indiceizquierda >= 0 && intercambiado)
                {
                    var lool = IndicesHijos[indiceDerecha];
                    if (!EstaLleno(SeekHijo(lool)))
                    {
                        caminoIzquierda.Add(IndicesHijos[indiceizquierda]);

                        CompartirHaciaLaIzquierda(Actual, caminoIzquierda.ToArray(), Nuevo);
                        intercambiado = false;
                    }
                    else
                    {
                        //Partir Hacia la derecha
                        PartirHaciaLaDerecha(Actual, SeekHijo(lool), Nuevo);
                    }
                }

                if (indiceDerecha <= IndicesHijos.Count && intercambiado)
                {
                    var lool = IndicesHijos[indiceDerecha];
                    if (!EstaLleno(SeekHijo(lool)))
                    {
                        caminoDerecha.Add(IndicesHijos[indiceDerecha]);

                        CompartirHaciaLaDerecha(Actual, caminoDerecha.ToArray(), Nuevo);
                    }
                    else
                    {
                        //Partir Hacia la derecha
                        PartirHaciaLaDerecha(Actual, SeekHijo(lool), Nuevo);
                    }
                }
            }
            public void PartirHaciaLaDerecha(NodoProducto Hijo, NodoProducto Hermano, Producto Nuevo)
            {
                var padre        = SeekPadre(Hijo.Padre);
                var NuevoHermano = new NodoProducto(Grado, true)
                {
                    Padre = Hijo.Padre,
                    id    = Siguiente
                };

                Siguiente++;
                var lista = new List <Producto>();

                //llenamos la lista
                foreach (var item in padre.Datos)
                {
                    if (item == null)
                    {
                        break;
                    }
                    else
                    {
                        lista.Add(item);
                    }
                }
                foreach (var item in Hijo.Datos)
                {
                    if (item == null)
                    {
                        break;
                    }
                    else
                    {
                        lista.Add(item);
                    }
                }
                foreach (var item in Hermano.Datos)
                {
                    if (item == null)
                    {
                        break;
                    }
                    else
                    {
                        lista.Add(item);
                    }
                }
                lista.Add(Nuevo);
                var array = lista.ToArray();

                SortDatos(array);
                lista = array.ToList <Producto>();
                var minimo       = ((2 * Grado) - 1) / 3;
                var listaPadre   = new List <Producto>();
                var listaHijo    = new List <Producto>();
                var listaHermano = new List <Producto>();
                var listaNuevo   = new List <Producto>();

                for (int i = 0; i < minimo; i++)
                {
                    listaHijo.Add(lista[0]);
                    lista.Remove(lista[0]);
                }
                listaPadre.Add(lista[0]);
                lista.Remove(lista[0]);
                for (int i = 0; i < minimo; i++)
                {
                    listaHermano.Add(lista[0]);
                    lista.Remove(lista[0]);
                }
                listaPadre.Add(lista[0]);
                lista.Remove(lista[0]);
                for (int i = 0; i < minimo; i++)
                {
                    listaNuevo.Add(lista[0]);
                    lista.Remove(lista[0]);
                }
                for (int i = 0; i < Hijo.Datos.Length; i++)
                {
                    if (listaHijo.Count != 0)
                    {
                        Hijo.Datos[i] = listaHijo[0]; listaHijo.Remove(listaHijo[0]);
                    }
                    else
                    {
                        Hijo.Datos[i] = null;
                    }
                }
                for (int i = 0; i < Hermano.Datos.Length; i++)
                {
                    if (listaHermano.Count != 0)
                    {
                        Hermano.Datos[i] = listaHermano[0]; listaHermano.Remove(listaHermano[0]);
                    }
                    else
                    {
                        Hermano.Datos[i] = null;
                    }
                }
                for (int i = 0; i < NuevoHermano.Datos.Length; i++)
                {
                    if (listaNuevo.Count != 0)
                    {
                        NuevoHermano.Datos[i] = listaNuevo[0]; listaNuevo.Remove(listaNuevo[0]);
                    }
                    else
                    {
                        NuevoHermano.Datos[i] = null;
                    }
                }
                for (int i = 0; i < padre.Datos.Length; i++)
                {
                    if (listaPadre.Count != 0)
                    {
                        padre.Datos[i] = listaPadre[0]; listaPadre.Remove(listaPadre[0]);
                    }
                    else
                    {
                        padre.Datos[i] = null;
                    }
                }
                for (int i = 0; i < padre.Hijos.Length; i++)
                {
                    if (padre.Hijos[i] == 0)
                    {
                        padre.Hijos[i] = NuevoHermano.id;
                        break;
                    }
                }
                EscribirMetaData();
                EscribirPadre(padre.id, padre);
                EscribirHijo(Hijo.id, Hijo);
                EscribirHijo(Hermano.id, Hermano);
                EscribirHijo(NuevoHermano.id, NuevoHermano);
            }
            public void PrimeraSeparacion(NodoProducto Actual, Producto Nuevo)
            {
                var lista = new List <Producto>();

                foreach (var item in Actual.Datos)
                {
                    lista.Add(item);
                }
                lista.Add(Nuevo);

                // escribir en el archivo todos los nodos disponibles del padre e hijos
                var hijo1 = new NodoProducto(Grado, true)
                {
                    Grado = Grado
                };

                hijo1.id = IdPAdre;
                var indice = 0;

                for (int i = 0; i < lista.Count / 2; i++)
                {
                    hijo1.Datos[indice] = lista[i];
                    indice++;
                }


                indice = 0;
                var hijo2 = new NodoProducto(Grado, true);

                hijo2.id = Siguiente;
                Siguiente++;
                for (int i = (lista.Count / 2) + 1; i < lista.Count; i++)
                {
                    hijo2.Datos[indice] = lista[i];
                    indice++;
                }
                var raiznueva = new NodoProducto(Grado, false)
                {
                    id = Siguiente
                };

                lista.Sort((x, y) => x.Nombre.CompareTo(y.Nombre));
                raiznueva.Datos[0] = lista[(lista.Count / 2) + 1];
                IdPAdre            = Siguiente;
                raiznueva.Hijos[0] = hijo1.id;
                raiznueva.Hijos[1] = hijo2.id;
                hijo1.Padre        = raiznueva.id;
                hijo2.Padre        = raiznueva.id;
                Siguiente++;
                SortDatos(raiznueva.Datos);
                SortDatos(hijo1.Datos);
                SortDatos(hijo2.Datos);

                var escritor = new StreamWriter(GlobalPath);

                //metadata
                escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" +
                                   $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" +
                                   $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}|");
                // nodos
                escritor.WriteLine(hijo1.WriteNodo());
                escritor.WriteLine(hijo2.WriteNodo());
                escritor.WriteLine(raiznueva.WriteNodo());
                escritor.Close();
            }