private void Subir(Nodo <T> nodoActual, string llave, T dato, int hijoDerecho) { if (!nodoActual.Lleno) { nodoActual.AgregarDato(llave, dato, hijoDerecho); nodoActual.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); return; } Nodo <T> nuevoHermano = new Nodo <T>(Orden, _ultimaPosicionLibre, nodoActual.Padre, _gaseosa); _ultimaPosicionLibre++; string llavePorSubir = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; T datoPorSubir = _gaseosa.CreateNulo(); nodoActual.SepararNodo(llave, dato, hijoDerecho, nuevoHermano, ref llavePorSubir, ref datoPorSubir); Nodo <T> nodoHijo = null; for (int i = 0; i < nuevoHermano.Hijos.Count; i++) { if (nuevoHermano.Hijos[i] != Utilidades.apuntadoVacio) { nodoHijo = Nodo <T> .LeerNodoDesdeDisco(_archivo, _tamañoEncabezadoBinario, Orden, nuevoHermano.Hijos[i], _gaseosa); nodoHijo.Padre = nuevoHermano.Posicion; nodoHijo.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); } else { break; } if (nodoActual.Padre == Utilidades.apuntadoVacio) { Nodo <T> nuevaRaiz = new Nodo <T>(Orden, _ultimaPosicionLibre, Utilidades.apuntadoVacio, _gaseosa); _ultimaPosicionLibre++; Altura++; nuevaRaiz.Hijos[0] = nodoActual.Posicion; nuevaRaiz.AgregarDato(llavePorSubir, datoPorSubir, nuevoHermano.Posicion); nodoActual.Padre = nuevaRaiz.Posicion; nuevoHermano.Padre = nuevaRaiz.Posicion; _raiz = nuevaRaiz.Posicion; nuevaRaiz.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); nodoActual.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); nuevoHermano.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); } else { nodoActual.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); nuevoHermano.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); Nodo <T> nodoPadre = Nodo <T> .LeerNodoDesdeDisco(_archivo, _tamañoEncabezadoBinario, Orden, nodoActual.Padre, _gaseosa); Subir(nodoPadre, llavePorSubir, datoPorSubir, nuevoHermano.Posicion); } } }