public void Insert(TKey newKey, TData newData) { cerrarArchivo(); archivoArbol = File.Open(rutaArchivo, FileMode.Open); if (Raiz == null) { nodoB <TKey, TData> newnodoB = NewnodoB(); newnodoB.insertar(newKey, newData); Raiz = newnodoB; archivoArbol.Seek(saltarEncabezado(), SeekOrigin.Begin); archivoArbol.Write(ConvertStringTo_ByteChain(mostrar(Raiz)), 0, mostrar(Raiz).Length); Cuenta++; Altura++; } else { insertarRecursivamente(newKey, newData, Raiz); } archivoArbol.Seek(0, SeekOrigin.Begin); if (Raiz == null) { Encabezado = Generador.armarEncabezado(Generador.hacerNulo().ToString(), Generador.tamanioPosicionesFijas(ultimaPosicion), Orden, Altura); } else { Encabezado = Generador.armarEncabezado(Generador.tamanioPosicionesFijas(Raiz.posicionPrincipal), Generador.tamanioPosicionesFijas(ultimaPosicion), Orden, Altura); } archivoArbol.Write(ConvertStringTo_ByteChain(Encabezado), 0, Encabezado.Length); cerrarArchivo(); }
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--; } } }
public string mostrar(nodoB <TKey, TData> Current) { string chain = ""; chain += Generador.tamanioPosicionesFijas(Current.posicionPrincipal) + "|" + listaCadenas(Current.nodoLlaves) + listaCadenas(Current.datosNodo) + Generador.tamanioPosicionesFijas(Current.Padre) + "|" + stringOfList(Current.Hijos) + Environment.NewLine; return(chain); }
private void actaulizarNodo(nodoB <TKey, TData> nnodoB) { int jumps = saltarLineasYEncabezados(nnodoB.posicionPrincipal); archivoArbol.Seek(jumps, SeekOrigin.Begin); archivoArbol.Write(ConvertStringTo_ByteChain(mostrar(nnodoB)), 0, mostrar(nnodoB).Length); archivoArbol.Flush(); }
public List <string> InOrder(nodoB <TKey, TData> currentnodoB, List <string> data) { cerrarArchivo(); archivoArbol = File.Open(rutaArchivo, FileMode.Open); data = InOrderRecursivo(currentnodoB, data); cerrarArchivo(); return(data); }
private nodoB <TKey, TData> prestamoHermano(nodoB <TKey, TData> Padre, nodoB <TKey, TData> actual) { int index = Padre.Hijos.IndexOf(actual.posicionPrincipal); List <int> Hijos = new List <int>(); for (int i = 0; i < Padre.Hijos.Count; i++) { if (Padre.Hijos[i] != Generador.hacerNulo()) { Hijos.Add(Padre.Hijos[i]); } } if (index == 0) { nodoB <TKey, TData> right = AccessTonodoB(Hijos[index + 1]); if (right.nodoLlaves.Count > (Orden % 2 == 0 ? Orden / 2 - 1 : Orden / 2)) { return(right); } } else if (index == Hijos.Count - 1) { nodoB <TKey, TData> left = AccessTonodoB(Hijos[index - 1]); if (left.nodoLlaves.Count > (Orden % 2 == 0 ? Orden / 2 - 1 : Orden / 2)) { return(left); } } else { nodoB <TKey, TData> left = AccessTonodoB(Hijos[index - 1]); nodoB <TKey, TData> right = AccessTonodoB(Hijos[index + 1]); if (left != null && right != null) { if (left.nodoLlaves.Count >= right.nodoLlaves.Count) { if (left.nodoLlaves.Count > (Orden % 2 == 0 ? Orden / 2 - 1 : Orden / 2) && left.posicionPrincipal != actual.posicionPrincipal) { return(left); } } else { if (right.nodoLlaves.Count > (Orden % 2 == 0 ? Orden / 2 - 1 : Orden / 2) && right.posicionPrincipal != actual.posicionPrincipal) { return(right); } } } } return(null); }
private int obtenerIndiceParaInsertar(nodoB <TKey, TData> Current, TKey newkey) { int indice = 0; while (newkey.CompareTo(Current.nodoLlaves[indice]) == 1) { if (indice + 1 == Current.nodoLlaves.Count) { return(indice + 1); } indice++; } return(indice); }
private void actualizarGrupoHijos(nodoB <TKey, TData> rightSon, List <int> HijosForNewnodoB) { nodoB <TKey, TData> hijo; for (int i = 0; i < HijosForNewnodoB.Count; i++) { if (HijosForNewnodoB[i] != Generador.hacerNulo()) { rightSon.Hijos[i] = HijosForNewnodoB[i]; hijo = AccessTonodoB(HijosForNewnodoB[i]); hijo.Padre = rightSon.posicionPrincipal; actaulizarNodo(hijo); } } actaulizarNodo(rightSon); }
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> NewnodoB() { nodoB <TKey, TData> nodoBAvailable; if (espaciosDisponibles.Count == 0) { return(nodoBAvailable = new nodoB <TKey, TData>(Orden, ultimaPosicion++, tamanioMaximoLlave)); } else { int p = espaciosDisponibles.Last(); espaciosDisponibles.Remove(p); nodoB <TKey, TData> n = AccessTonodoB(p); n.limpiar(); return(n); } }
private nodoB <TKey, TData> ultimoNodoDerecho(nodoB <TKey, TData> LeftSonOfCurrentnodoB) { if (LeftSonOfCurrentnodoB.Hijos[0] == Generador.hacerNulo()) { return(LeftSonOfCurrentnodoB); } else { for (int j = LeftSonOfCurrentnodoB.Hijos.Count - 1; j >= 0; j--) { if (LeftSonOfCurrentnodoB.Hijos[j] != Generador.hacerNulo()) { return(ultimoNodoDerecho(AccessTonodoB(LeftSonOfCurrentnodoB.Hijos[j]))); } } return(null); } }
public arbolBAsterisco(int TreeOrder, string archivoArbolName, string archivoArbolPath, ConvertStringToKey KeyConverter, ConvertStringToData StringConverter, GetData DataConverter, int KeyMaxLength, GetDataLength DataMaxLength) { Raiz = null; Orden = TreeOrder; Cuenta = 0; Altura = 0; ultimaPosicion = 0; rutaArchivo = archivoArbolPath + archivoArbolName; archivoArbol = File.Create(rutaArchivo);//Se creará en la carpeta del proyecto espaciosDisponibles = new List <int>(); Encabezado = Generador.armarEncabezado(Generador.hacerNulo().ToString(), Generador.tamanioPosicionesFijas(0), Orden, 0) + Environment.NewLine; archivoArbol.Write(ConvertStringTo_ByteChain(Encabezado), 0, Encabezado.Length); ConverterStringToTkey = KeyConverter; ConverterStringToTData = StringConverter; retornarDatos = DataConverter; tamanioMaximoLlave = KeyMaxLength; retornarTamanioDatos = DataMaxLength; cerrarArchivo(); }
public nodoB <TKey, TData> AccessTonodoB(int posicionPrincipal) { if (posicionPrincipal == Generador.hacerNulo()) { return(null); } int saltos = 0; saltos = saltarLineasYEncabezados(posicionPrincipal); StreamReader reader = new StreamReader(archivoArbol); reader.BaseStream.Seek(saltos, SeekOrigin.Begin); string[] nodoBLine = reader.ReadLine().Split('|'); nodoB <TKey, TData> AuxnodoB = new nodoB <TKey, TData>(Orden, int.Parse(nodoBLine[0]), tamanioMaximoLlave); for (int i = 1; i < Orden; i++) { if (nodoBLine[i] != Generador.hacerNuloLlaves(tamanioMaximoLlave)) { AuxnodoB.nodoLlaves.Add(ConverterStringToTkey(Generador.retornarLlaveOriginal(nodoBLine[i]))); } } int condicion = (Orden); for (int i = condicion; i < condicion + (Orden - 1); i++) { if (nodoBLine[i] != Generador.hacerNuloDatos(GetMaxLenghtData(retornarTamanioDatos())) || nodoBLine[i].Contains('#')) { AuxnodoB.datosNodo.Add(ConverterStringToTData(Generador.retornarDatosOriginales(nodoBLine[i]))); } } condicion += (Orden - 1); AuxnodoB.Padre = int.Parse(nodoBLine[condicion]); condicion += 1; int c = 0; for (int i = condicion; i < condicion + Orden; i++) { AuxnodoB.Hijos[c++] = int.Parse(nodoBLine[i]); } return(AuxnodoB); }
public arbolBAsterisco(string archivoArbolPath, string archivoArbolName, ConvertStringToKey convertidorLlave, ConvertStringToData convertidorString, GetData convertidorDatos, int maximaLongitudLlave, GetDataLength maximaLongitudDatos) { rutaArchivo = archivoArbolPath + archivoArbolName; ConverterStringToTkey = convertidorLlave; ConverterStringToTData = convertidorString; retornarDatos = convertidorDatos; tamanioMaximoLlave = maximaLongitudLlave; retornarTamanioDatos = maximaLongitudDatos; StreamReader lector = new StreamReader(archivoArbolPath + archivoArbolName); int RaizposicionPrincipal = int.Parse(lector.ReadLine()); ultimaPosicion = int.Parse(lector.ReadLine()); lector.ReadLine(); Orden = int.Parse(lector.ReadLine()); Cuenta = 0; Altura = int.Parse(lector.ReadLine()); espaciosDisponibles = new List <int>(); lector.Close(); archivoArbol = File.Open(rutaArchivo, FileMode.Open); Raiz = AccessTonodoB(RaizposicionPrincipal); }
private List <string> InOrderRecursivo(nodoB <TKey, TData> currentnodoB, List <string> data) { if (currentnodoB == null) { return(data); } if (currentnodoB.esHoja()) { for (int i = 0; i < currentnodoB.datosNodo.Count; i++) { IList <string> values = retornarDatos(currentnodoB.datosNodo[i]); string line = ""; for (int j = 0; j < values.Count; j++) { line += values[j] + "|"; } data.Add(line.Remove(line.Length - 1) + "\n"); } return(data); } else { for (int i = 0; i < currentnodoB.Hijos.Count; i++) { data.Concat(InOrderRecursivo(AccessTonodoB(currentnodoB.Hijos[i]), data)); if (i < currentnodoB.datosNodo.Count) { IList <string> values = retornarDatos(currentnodoB.datosNodo[i]); string line = ""; for (int j = 0; j < values.Count; j++) { line += values[j] + "|"; } data.Add(line.Remove(line.Length - 1) + "\n"); } } return(data); } }
private int posicionPrincipal(nodoB <TKey, TData> Padre, TKey KeyPop) { if (Padre == null) { return(1); } if (Padre.posicionAproximada(KeyPop) == 0) { return(-1); } else if (Padre.posicionAproximada(KeyPop) == Padre.nodoLlaves.Count) { return(1); } else if (Padre.posicionAproximada(KeyPop) >= Orden / 2) { return(0); } else { return(-1); } }
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); } }