예제 #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 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);
                }
            }
        }
예제 #3
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);
                    }
                }
            }
        }