Exemplo n.º 1
0
        private void Subir(Nodo <T> nodoActual, string llave, T dato, int hijoDerecho)
        {
            if (!nodoActual.Lleno)
            {
                nodoActual.AgregarDato(llave, dato, hijoDerecho);
                nodoActual.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);
                return;
            }
            Nodo <T> nuevoHermano = new Nodo <T>(Orden, _ultimaPosicionLibre, nodoActual.Padre, _gaseosa);

            _ultimaPosicionLibre++;
            string llavePorSubir = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            T      datoPorSubir  = _gaseosa.CreateNulo();

            nodoActual.SepararNodo(llave, dato, hijoDerecho, nuevoHermano, ref llavePorSubir, ref datoPorSubir);
            Nodo <T> nodoHijo = null;

            for (int i = 0; i < nuevoHermano.Hijos.Count; i++)
            {
                if (nuevoHermano.Hijos[i] != Utilidades.apuntadoVacio)
                {
                    nodoHijo = Nodo <T> .LeerNodoDesdeDisco(_archivo, _tamañoEncabezadoBinario, Orden, nuevoHermano.Hijos[i], _gaseosa);

                    nodoHijo.Padre = nuevoHermano.Posicion;
                    nodoHijo.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);
                }
                else
                {
                    break;
                }
                if (nodoActual.Padre == Utilidades.apuntadoVacio)
                {
                    Nodo <T> nuevaRaiz = new Nodo <T>(Orden, _ultimaPosicionLibre, Utilidades.apuntadoVacio, _gaseosa);
                    _ultimaPosicionLibre++;
                    Altura++;
                    nuevaRaiz.Hijos[0] = nodoActual.Posicion;
                    nuevaRaiz.AgregarDato(llavePorSubir, datoPorSubir, nuevoHermano.Posicion);
                    nodoActual.Padre   = nuevaRaiz.Posicion;
                    nuevoHermano.Padre = nuevaRaiz.Posicion;
                    _raiz = nuevaRaiz.Posicion;

                    nuevaRaiz.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);
                    nodoActual.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);
                    nuevoHermano.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);
                }
                else
                {
                    nodoActual.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);
                    nuevoHermano.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);

                    Nodo <T> nodoPadre = Nodo <T> .LeerNodoDesdeDisco(_archivo, _tamañoEncabezadoBinario, Orden, nodoActual.Padre, _gaseosa);

                    Subir(nodoPadre, llavePorSubir, datoPorSubir, nuevoHermano.Posicion);
                }
            }
        }