private void Subir(Nodes <T, Tkey> nodoActual, int llave, T dato, int hijoDerecho) { if (!nodoActual.Overflow) { nodoActual.AgregarDato(llave, dato, hijoDerecho); nodoActual.GuardarNodoEnDisco(archivo, Encabezado); return; } Nodes <T, Tkey> Hermano = new Nodes <T, int>(Orden, UltimaPosLibre, nodoActual.Father, Creador); UltimaPosLibre++; int llavePorsubir = Utilities.ApuntadorVacio; T datoPorSubir = Creador.CrearNulo(); nodoActual.SepararNodo(llave, dato, hijoDerecho, Hermano, ref llavePorsubir, datoPorSubir); Nodes <T, int> Hijo = null; for (int i = 0; i < Hermano.Children.Count; i++) { if (Hermano.Children[i] != Utilities.ApuntadorVacio) { Hijo = Nodes <T, int> .ReadNodesInDisk(archivo, Encabezado, Orden, Hermano.Children[i], Creador); Hijo.Father = Hermano.Position; Hijo.GuardarNodoEnDisco(archivo, Encabezado); } else { break; } } if (nodoActual.Father == Utilities.ApuntadorVacio) { Nodes <T, int> nuevaRaiz = new Nodes <T, int>(Orden, UltimaPosLibre, Utilities.ApuntadorVacio, Creador); UltimaPosLibre++; Altura++; nuevaRaiz.Children[0] = nodoActual.Position; nuevaRaiz.AgregarDato(llavePorsubir, datoPorSubir, Hermano.Position); nodoActual.Father = nuevaRaiz.Position; Hermano.Father = nuevaRaiz.Position; raiz = nuevaRaiz.Position; nuevaRaiz.GuardarNodoEnDisco(archivo, Encabezado); Hermano.GuardarNodoEnDisco(archivo, Encabezado); Hermano.GuardarNodoEnDisco(archivo, Encabezado); } else { nodoActual.GuardarNodoEnDisco(archivo, Encabezado); Hermano.GuardarNodoEnDisco(archivo, Encabezado); Nodes <T, int> nodoPadre = Nodes <T, int> .ReadNodesInDisk(archivo, Encabezado, Orden, nodoActual.Father, Creador); Subir(nodoPadre, llavePorsubir, datoPorSubir, Hermano.Position); } }