private nodoB <TKey, TData> SearchRecursive(nodoB <TKey, TData> currentnodoB, TKey key) { if (currentnodoB.nodoLlaves.Exists(x => key.CompareTo(x) == 0)) { return(currentnodoB); } else { int index = currentnodoB.posicionAproximada(key); if (currentnodoB.obtenerNodoIndice(index) == Generador.hacerNulo()) { return(null); } return(SearchRecursive(AccessTonodoB(currentnodoB.Hijos[index]), key)); } }
private nodoB <TKey, TData> InsertPop(nodoB <TKey, TData> Actual, TData DataPop, TKey KeyPop, int posicionI) { if (Actual.estaLleno()) { Actual.insertar(KeyPop, DataPop); DataPop = Actual.nivelSuperior(ref KeyPop); nodoB <TKey, TData> Hermano = NewnodoB(); nodoB <TKey, TData> Padre = AccessTonodoB(Actual.Padre); Hermano.Padre = Actual.Padre; actaulizarNodo(Hermano); actaulizarNodo(Actual); if (Padre == null) { nodoB <TKey, TData> newRaiz = NewnodoB(); newRaiz.insertar(KeyPop, DataPop); newRaiz.insertarHijos(0, Actual.posicionPrincipal); newRaiz.insertarHijos(1, Hermano.posicionPrincipal); Raiz = newRaiz; Actual.Padre = newRaiz.posicionPrincipal; Hermano.Padre = newRaiz.posicionPrincipal; actaulizarNodo(Raiz); actaulizarNodo(Actual); actaulizarNodo(Hermano); Altura++; if (posicionI < 0) { List <int> leftSon = new List <int>(); List <TData> nData = new List <TData>(); Hermano.nodoLlaves = Actual.HijosAndValuesToBrother(KeyPop, ref nData, ref leftSon); Hermano.datosNodo = nData; actualizarGrupoHijos(Actual, Actual.Hijos); actualizarGrupoHijos(Hermano, leftSon); actaulizarNodo(Actual); actaulizarNodo(Hermano); return(Actual); } else { List <int> leftSon = new List <int>(); List <TData> nData = new List <TData>(); Hermano.nodoLlaves = Actual.hijosyvaloresActuales(KeyPop, ref nData, ref leftSon); Hermano.datosNodo = nData; actualizarGrupoHijos(Actual, Actual.Hijos); actualizarGrupoHijos(Hermano, leftSon); actaulizarNodo(Actual); actaulizarNodo(Hermano); return(Hermano); } } else { List <int> leftSon = new List <int>(); List <TData> nData = new List <TData>(); nodoB <TKey, TData> auxPadre = InsertPop(Padre, DataPop, KeyPop, posicionPrincipal(Padre, KeyPop)); int aproximateposicionPrincipal = auxPadre.posicionAproximada(KeyPop); auxPadre.insertarHijos(aproximateposicionPrincipal, Hermano.posicionPrincipal); Hermano.Padre = auxPadre.posicionPrincipal; Actual = AccessTonodoB(Actual.posicionPrincipal); Padre = AccessTonodoB(Padre.posicionPrincipal); if (posicionI < 0) { Hermano.nodoLlaves = Actual.HijosAndValuesToBrother(KeyPop, ref nData, ref leftSon); Hermano.datosNodo = nData; actualizarGrupoHijos(Hermano, leftSon); actaulizarNodo(auxPadre); actaulizarNodo(Actual); actaulizarNodo(Hermano); actaulizarNodo(Padre); actualizarGrupoHijos(Padre, Padre.Hijos); actualizarGrupoHijos(auxPadre, auxPadre.Hijos); return(Actual); } else if (posicionI > 0) { Hermano.nodoLlaves = Actual.hijosyvaloresActuales(KeyPop, ref nData, ref leftSon); Hermano.datosNodo = nData; actualizarGrupoHijos(Hermano, leftSon); Hermano.Padre = auxPadre.posicionPrincipal; actaulizarNodo(auxPadre); actaulizarNodo(Actual); actaulizarNodo(Hermano); actaulizarNodo(Padre); actualizarGrupoHijos(Padre, Padre.Hijos); actualizarGrupoHijos(auxPadre, auxPadre.Hijos); auxPadre = AccessTonodoB(auxPadre.posicionPrincipal); Actual = AccessTonodoB(Actual.posicionPrincipal); Hermano = AccessTonodoB(Hermano.posicionPrincipal); Padre = AccessTonodoB(Padre.posicionPrincipal); return(Hermano); } else { Hermano.nodoLlaves = Actual.hijosyvaloresActuales(KeyPop, ref nData, ref leftSon); Hermano.datosNodo = nData; actualizarGrupoHijos(Hermano, leftSon); actaulizarNodo(auxPadre); actaulizarNodo(Actual); actaulizarNodo(Hermano); actaulizarNodo(Padre); actualizarGrupoHijos(Padre, Padre.Hijos); actualizarGrupoHijos(auxPadre, auxPadre.Hijos); return(Hermano); } } } else { Actual.insertar(KeyPop, DataPop); actaulizarNodo(Actual); if (Actual.posicionPrincipal == Raiz.posicionPrincipal) { Raiz = Actual; } return(Actual); } }