private void Prestamo(BNode <TKey, T> corriente, BNode <TKey, T> hermanoNodo, int elimonarPosi) { int prestamoHermano = ObtenerHermanoExtremo(corriente, hermanoNodo); int espacioIndex = ObtenerNumeroEspacioPadres(corriente, hermanoNodo); TKey espacioTKey = archivoArbol.ConvertirLinea(nombreArchivo, corriente.Padre, grado).Llave[espacioIndex]; T espacioT = archivoArbol.ConvertirLinea(nombreArchivo, corriente.Padre, grado).Datos[espacioIndex]; BNode <TKey, T> padre = archivoArbol.ConvertirLinea(nombreArchivo, corriente.Padre, grado); padre.Llave[espacioIndex] = hermanoNodo.Llave[prestamoHermano]; padre.Datos[espacioIndex] = hermanoNodo.Datos[prestamoHermano]; corriente.Llave[elimonarPosi] = espacioTKey; corriente.Datos[elimonarPosi] = espacioT; hermanoNodo.Llave.RemoveAt(prestamoHermano); hermanoNodo.Datos.RemoveAt(prestamoHermano); if (prestamoHermano == 0 && hermanoNodo.HijoCon() > 0) { int hijo = hermanoNodo.ApuntaHijo[prestamoHermano]; corriente.ApuntaHijo[corriente.HijoCon()] = hijo; hermanoNodo.ApuntaHijo[prestamoHermano] = -2147483648; } else if (hermanoNodo.HijoCon() > 0) { corriente.ApuntaHijo[0] = hermanoNodo.ApuntaHijo[prestamoHermano]; hermanoNodo.ApuntaHijo[prestamoHermano] = -2147483648; } archivoArbol.InsertarNodo(padre, nombreArchivo, true); archivoArbol.InsertarNodo(corriente, nombreArchivo, true); archivoArbol.InsertarNodo(hermanoNodo, nombreArchivo, true); }
private void Mezcla(BNode <TKey, T> corriente, BNode <TKey, T> HermanoNodo) { int corrienteIndex = ObtenerNumeroHijosPadres(corriente.Posi, archivoArbol.ConvertirLinea(nombreArchivo, corriente.Padre, grado)); int hermanoIndex = ObtenerNumeroHijosPadres(HermanoNodo.Posi, archivoArbol.ConvertirLinea(nombreArchivo, HermanoNodo.Padre, grado)); int espacioIndex = ObtenerNumeroEspacioPadres(corriente, HermanoNodo); corriente = CrearMezcla(corrienteIndex, hermanoIndex, espacioIndex, archivoArbol.ConvertirLinea(nombreArchivo, corriente.Padre, grado)); // Convertir nulo al hermano for (int i = 0; i < HermanoNodo.Datos.Count; i++) { HermanoNodo.Datos.RemoveAt(i); HermanoNodo.Llave.RemoveAt(i); } for (int i = 0; i < HermanoNodo.HijoCon(); i++) { HermanoNodo.ApuntaHijo[i] = -2147483648; } BNode <TKey, T> padre = archivoArbol.ConvertirLinea(nombreArchivo, corriente.Padre, grado); archivoArbol.InsertarNodo(corriente, nombreArchivo, true); archivoArbol.InsertarNodo(padre, nombreArchivo, true); int hermanoPadre = ObtenerNumeroHijosPadres(HermanoNodo.Posi, padre); padre.ApuntaHijo[hermanoPadre] = -2147483648; archivoArbol.InsertarNodo(padre, nombreArchivo, true); }
private int ObtenerNumeroHijosPadres(int posiHijo, BNode <TKey, T> nodoPadre) { int index = 0; for (int i = 0; i < nodoPadre.HijoCon(); i++) { if (archivoArbol.ConvertirLinea(nombreArchivo, nodoPadre.ApuntaHijo[i], grado).Posi == posiHijo) { index = i; return(index); } } return(index); }
private bool Hoja(BNode <TKey, T> CorrienteB) { try { if (CorrienteB.HijoCon() == 0) { return(true); } return(false); } catch { return(true); } }
private BNode <TKey, T> CrearMezcla(int corriente, int hermanoNodo, int espacioPadre, BNode <TKey, T> padrel) { BNode <TKey, T> nuevoNodo; // Eliminar al padre del que ya se eliminio if (corriente < hermanoNodo) { nuevoNodo = archivoArbol.ConvertirLinea(nombreArchivo, padrel.ApuntaHijo[corriente], grado); nuevoNodo.Llave[nuevoNodo.LlaveCon()] = padrel.Llave[espacioPadre]; nuevoNodo.Datos[nuevoNodo.DatoCon()] = padrel.Datos[espacioPadre]; EliminarIndex.Enqueue(espacioPadre); EliminarPadre.Enqueue(padrel.Posi); EliminarUnder(padrel, espacioPadre); BNode <TKey, T> hermano = archivoArbol.ConvertirLinea(nombreArchivo, padrel.ApuntaHijo[hermanoNodo], grado); for (int i = 0; i < hermano.LlaveCon(); i++) { nuevoNodo.Llave[nuevoNodo.LlaveCon()] = hermano.Llave[i]; nuevoNodo.Datos[nuevoNodo.DatoCon()] = hermano.Datos[i]; } for (int j = 0; j < hermano.HijoCon(); j++) { nuevoNodo.ApuntaHijo[nuevoNodo.HijoCon()] = hermano.ApuntaHijo[j]; } BNode <TKey, T> padre = archivoArbol.ConvertirLinea(nombreArchivo, hermano.Padre, grado); padre.ApuntaHijo.Remove(hermano.Posi); padre.ApuntaHijo[padre.HijoCon()] = nuevoNodo.Posi; archivoArbol.InsertarNodo(padre, nombreArchivo, true); hermano.Padre = -2147483648; archivoArbol.InsertarNodo(hermano, nombreArchivo, true); } else { nuevoNodo = archivoArbol.ConvertirLinea(nombreArchivo, padrel.ApuntaHijo[hermanoNodo], grado); nuevoNodo.Llave[nuevoNodo.LlaveCon()] = (padrel.Llave[espacioPadre]); nuevoNodo.Datos[nuevoNodo.LlaveCon()] = (padrel.Datos[espacioPadre]); EliminarIndex.Enqueue(espacioPadre); EliminarPadre.Enqueue(padrel.Posi); EliminarUnder(padrel, espacioPadre); BNode <TKey, T> corrient = archivoArbol.ConvertirLinea(nombreArchivo, padrel.ApuntaHijo[corriente], grado); for (int i = 0; i < corrient.LlaveCon(); i++) { nuevoNodo.Llave[nuevoNodo.LlaveCon()] = corrient.Llave[i]; nuevoNodo.Datos[nuevoNodo.LlaveCon()] = corrient.Datos[i]; } for (int j = 0; j < corrient.HijoCon(); j++) { nuevoNodo.ApuntaHijo[nuevoNodo.HijoCon()] = corrient.ApuntaHijo[j]; } BNode <TKey, T> padrelo = archivoArbol.ConvertirLinea(nombreArchivo, corrient.Padre, grado); padrelo.ApuntaHijo.Remove(corrient.Posi); padrelo.ApuntaHijo[padrelo.HijoCon()] = nuevoNodo.Posi; archivoArbol.InsertarNodo(padrelo, nombreArchivo, true); corrient.Padre = -2147483648; archivoArbol.InsertarNodo(corrient, nombreArchivo, true); } List <int> hijoCorrecto = new List <int>(); for (int i = 0; i < nuevoNodo.ApuntaHijo.Count; i++) { if (nuevoNodo.ApuntaHijo[i] > -2147483648) { hijoCorrecto.Add(nuevoNodo.ApuntaHijo[i]); } } nuevoNodo.ApuntaHijo = hijoCorrecto; return(nuevoNodo); }
private BNode <TKey, T> DerEnIz(BNode <TKey, T> escogido, int eliminarPosi) { BNode <TKey, T> nodoApunta = archivoArbol.ConvertirLinea(nombreArchivo, escogido.ApuntaHijo[eliminarPosi], grado); while (!Hoja(nodoApunta)) { nodoApunta = archivoArbol.ConvertirLinea(nombreArchivo, nodoApunta.ApuntaHijo[nodoApunta.HijoCon() - 1], grado); } return(nodoApunta); }