Example #1
0
        private void Subir(Nodes <T, Tkey> nodoActual, int llave, T dato, int hijoDerecho)
        {
            if (!nodoActual.Overflow)
            {
                nodoActual.AgregarDato(llave, dato, hijoDerecho); nodoActual.GuardarNodoEnDisco(archivo, Encabezado);
                return;
            }

            Nodes <T, Tkey> Hermano = new Nodes <T, int>(Orden, UltimaPosLibre, nodoActual.Father, Creador);

            UltimaPosLibre++;

            int llavePorsubir = Utilities.ApuntadorVacio;
            T   datoPorSubir  = Creador.CrearNulo();

            nodoActual.SepararNodo(llave, dato, hijoDerecho, Hermano, ref llavePorsubir, datoPorSubir);

            Nodes <T, int> Hijo = null;

            for (int i = 0; i < Hermano.Children.Count; i++)
            {
                if (Hermano.Children[i] != Utilities.ApuntadorVacio)
                {
                    Hijo = Nodes <T, int> .ReadNodesInDisk(archivo, Encabezado, Orden, Hermano.Children[i], Creador);

                    Hijo.Father = Hermano.Position;
                    Hijo.GuardarNodoEnDisco(archivo, Encabezado);
                }
                else
                {
                    break;
                }
            }
            if (nodoActual.Father == Utilities.ApuntadorVacio)
            {
                Nodes <T, int> nuevaRaiz = new Nodes <T, int>(Orden, UltimaPosLibre, Utilities.ApuntadorVacio, Creador);
                UltimaPosLibre++;
                Altura++;

                nuevaRaiz.Children[0] = nodoActual.Position;
                nuevaRaiz.AgregarDato(llavePorsubir, datoPorSubir, Hermano.Position);


                nodoActual.Father = nuevaRaiz.Position;
                Hermano.Father    = nuevaRaiz.Position;
                raiz = nuevaRaiz.Position;


                nuevaRaiz.GuardarNodoEnDisco(archivo, Encabezado);
                Hermano.GuardarNodoEnDisco(archivo, Encabezado);
                Hermano.GuardarNodoEnDisco(archivo, Encabezado);
            }
            else
            {
                nodoActual.GuardarNodoEnDisco(archivo, Encabezado);
                Hermano.GuardarNodoEnDisco(archivo, Encabezado);


                Nodes <T, int> nodoPadre = Nodes <T, int> .ReadNodesInDisk(archivo, Encabezado, Orden, nodoActual.Father, Creador);

                Subir(nodoPadre, llavePorsubir, datoPorSubir, Hermano.Position);
            }
        }