private void insertarRecursivamente(TKey newKey, TData newData, nodoB <TKey, TData> Current) { if (Current.esHoja()) { if (!Current.estaLleno()) /*Insertará si y solo si es hoja y está vacío*/ { Current.insertar(newKey, newData); actaulizarNodo(Current); } else { //Esto indica que donde se iba a inseratr está lleno nodoB <TKey, TData> aux = AccessTonodoB(Current.Padre); InsertPop(Current, newData, newKey, posicionPrincipal(aux, newKey)); } } else { //Se moviliza hacia otro nodo if (newKey.CompareTo(Current.nodoLlaves[0]) == -1) { insertarRecursivamente(newKey, newData, AccessTonodoB(Current.Hijos[0])); } else if (newKey.CompareTo(Current.nodoLlaves[0]) == 1) { int index = obtenerIndiceParaInsertar(Current, newKey); insertarRecursivamente(newKey, newData, AccessTonodoB(Current.Hijos[index])); } else { Cuenta--; } } }
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); } }