public void Insertar(T valor) { Raiz = BReader <T> .LeerRaiz(RutaArbol); if (Raiz == int.MinValue) { NodoB <T> nodo = new NodoB <T>(TamañoT, Grado, PosicionDisponible); nodo.Valores[0] = valor; BWriter <T> .EscribirNodo(RutaArbol, nodo, PosicionDisponible); Raiz = nodo.posicion; BWriter <T> .EscribirRaiz(RutaArbol, Raiz); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); } else { int posicionNodo = BuscarPosicion(valor, GuardarNodo(BReader <T> .LeerNodo(RutaArbol, Raiz))); if (posicionNodo != int.MaxValue) { NodoB <T> Nodo = GuardarNodo(BReader <T> .LeerNodo(RutaArbol, posicionNodo)); InsertarValor(valor, ref Nodo); BWriter <T> .EscribirNodo(RutaArbol, Nodo, Nodo.posicion); if (Nodo.Valores[Grado - 1] != null) { SepararNodo(Nodo); } } } }
public void RepartirHijos(NodoB <T> nodo, NodoB <T> hermano, int posicionMedia) { int x = 0; for (int i = posicionMedia + 1; i < nodo.hijos.Length; i++) { hermano.hijos[x] = nodo.hijos[i]; nodo.hijos[i] = int.MinValue; x++; } for (int i = 0; i < hermano.hijos.Length; i++) { if (hermano.hijos[i] != int.MinValue) { NodoB <T> temp = GuardarNodo(BReader <T> .LeerNodo(RutaArbol, hermano.hijos[i])); temp.Padre = hermano.posicion; BWriter <T> .EscribirNodo(RutaArbol, temp, temp.posicion); } } }
public void SepararNodo(NodoB <T> nodo) { if (nodo.Valores[Grado - 1] != null) { if (nodo.Padre == int.MinValue) { int posicionMedia = Grado / 2; T valorASubir = nodo.Valores[posicionMedia]; NodoB <T> hermano = new NodoB <T>(TamañoT, Grado, PosicionDisponible); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); NodoB <T> padre = new NodoB <T>(TamañoT, Grado, PosicionDisponible); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); Raiz = padre.posicion; BWriter <T> .EscribirRaiz(RutaArbol, Raiz); hermano.Padre = padre.posicion; nodo.Padre = padre.posicion; RepartirValores(posicionMedia, ref nodo, ref hermano); if (!VerSiEsHoja(nodo)) { RepartirHijos(nodo, hermano, posicionMedia); } BWriter <T> .EscribirNodo(RutaArbol, hermano, hermano.posicion); BWriter <T> .EscribirNodo(RutaArbol, nodo, nodo.posicion); InsertarValor(valorASubir, ref padre); padre.hijos[0] = nodo.posicion; padre.hijos[1] = hermano.posicion; BWriter <T> .EscribirNodo(RutaArbol, padre, padre.posicion); } else { int posicionMedia = Grado / 2; T valorASubir = nodo.Valores[posicionMedia]; NodoB <T> hermano = new NodoB <T>(TamañoT, Grado, PosicionDisponible); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); NodoB <T> padre = GuardarNodo(BReader <T> .LeerNodo(RutaArbol, nodo.Padre)); hermano.Padre = padre.posicion; RepartirValores(posicionMedia, ref nodo, ref hermano); if (!VerSiEsHoja(nodo)) { RepartirHijos(nodo, hermano, posicionMedia); } BWriter <T> .EscribirNodo(RutaArbol, hermano, hermano.posicion); BWriter <T> .EscribirNodo(RutaArbol, nodo, nodo.posicion); InsertarValor(valorASubir, ref padre); bool hijoEncontrado = false; int posicionHijo = int.MinValue; int temp = int.MinValue; for (int i = 0; i < padre.hijos.Length; i++) { if (hijoEncontrado) { if (i == posicionHijo + 1) { temp = padre.hijos[i]; padre.hijos[i] = hermano.posicion; } else { int temp2 = padre.hijos[i]; padre.hijos[i] = temp; temp = temp2; } } else { if (padre.hijos[i] == nodo.posicion) { hijoEncontrado = true; posicionHijo = i; } } } if (padre.hijos[Grado] != int.MinValue) { SepararNodo(padre); } else { BWriter <T> .EscribirNodo(RutaArbol, padre, padre.posicion); } } } }