Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
        public void Insertar(T valor, Delegate delegado)
        {
            BReader <T> .LeerEncabezado(RutaArbol, ref Raiz, ref PosicionDisponible);

            if (Raiz == int.MinValue)
            {
                NodoB <T> nuevo = new NodoB <T>(valor.FixedSizeText, Grado);
                nuevo.Valores.Add(valor);
                BWriter.Escribir()
            }
            else
            {
                NodoB <T> aux = Raiz;

                for (int i = 0; i < Grado - 1; i++)
                {
                    if ((int)delegado.DynamicInvoke(aux.Valores[i], valor) == -1)
                    {
                    }
                    else if ((int)delegado.DynamicInvoke(aux.Valores[i], valor) == 1)
                    {
                    }
                }


                if (nuevo.Valores.Count == Grado)
                {
                    Ordenar
                }
            }
        }
Пример #3
0
        public Arbol_BAsterisco(int grado, string ruta)
        {
            Grado = grado;
            Raiz  = int.MinValue;
            PosicionDisponible = 1;
            RutaArbol          = ruta;

            BWriter.Escribir(Raiz.ToString("00000000000;-0000000000"), RutaArbol);
            BWriter.Escribir(PosicionDisponible.ToString("00000000000;-0000000000"), RutaArbol);
        }
Пример #4
0
        public ArbolB(int grado, string ruta, string archivo, int tamañoValor, Func <string, T> funcion, Func <string> nullFormat, Delegate comp1, Delegate comp2)
        {
            Grado = grado;
            Raiz  = int.MinValue;
            PosicionDisponible = 1;
            BWriter <T> .EvaluarRuta(ruta);

            RutaArbol     = ruta + archivo;
            TamañoT       = tamañoValor;
            ConvertToT    = funcion;
            ToTNullFormat = nullFormat;
            comparador1   = comp1;
            comparador2   = comp2;

            BWriter <T> .EscribirRaiz(RutaArbol, int.MinValue);

            BWriter <T> .EscribirPosicionDisponible(RutaArbol, 1);
        }
Пример #5
0
        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);
                }
            }
        }
Пример #6
0
        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);
                    }
                }
            }
        }