예제 #1
0
        private void AgregarRecursivo(int posicionNodoActual, string llave, T dato)
        {
            NodoB <T> nodoActual = NodoB <T> .LeerNodoDesdeDisco(_archivo, _tamañoEncabezadoBinario, Orden, posicionNodoActual, _fabrica);

            if (nodoActual.PosicionExactaEnNodo(llave) != -1)
            {
                throw new InvalidOperationException("La llave indicada ya está contenida en el árbol.");
            }
            if (nodoActual.EsHoja)
            {
                // Se debe insertar en este nodo, por lo que se hace la llamada
                // al método encargado de insertar y ajustar el árbol si es necesario
                Subir(nodoActual, llave, dato, Utilidades.ApuntadorVacio);
                GuardarEncabezado();
            }
            else
            {
                // Se hace una llamada recursiva, bajando en el subarbol
                // correspondiente según la posición aproximada de la llave
                AgregarRecursivo(nodoActual.Hijos[nodoActual.PosicionAproximadaEnNodo(llave)], llave, dato);
            }
        }
예제 #2
0
        private NodoB <T> ObtenerRecursivo(int posicionNodoActual, string llave, out int posicion)
        {
            NodoB <T> nodoActual = NodoB <T> .LeerNodoDesdeDisco(_archivo, _tamañoEncabezadoBinario, Orden, posicionNodoActual, _fabrica);

            posicion = nodoActual.PosicionExactaEnNodo(llave);
            if (posicion != -1)
            {
                return(nodoActual);
            }
            else
            {
                if (nodoActual.EsHoja)
                {
                    return(null);
                }
                else
                {
                    int posicionAproximada = nodoActual.PosicionAproximadaEnNodo(llave);
                    return(ObtenerRecursivo(nodoActual.Hijos[posicionAproximada], llave, out posicion));
                }
            }
        }