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); } }
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)); } } }