Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 private bool Hoja(BNode <TKey, T> CorrienteB)
 {
     try
     {
         if (CorrienteB.HijoCon() == 0)
         {
             return(true);
         }
         return(false);
     }
     catch
     {
         return(true);
     }
 }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }