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 int saltarLinea(int LengthOfData, int LengthOfKeys) { int NullLength = Generador.contadorCaracteresNulos(); int MaxKeys = (Orden - 1); return(1 + ((NullLength + 1) + (MaxKeys * LengthOfKeys + MaxKeys) + (MaxKeys * LengthOfData + MaxKeys) + (NullLength + 1) + (NullLength * Orden + Orden)) + 1); }
private string listaCadenas(List <TData> s) { string chain = ""; for (int i = 0; i < Orden - 1; i++) { string aux = ""; if (i < s.Count) { IList <string> valuesFromData = retornarDatos(s[i]); IList <int> valuesLenght = retornarTamanioDatos(); for (int j = 0; j < valuesFromData.Count; j++) { aux += Generador.tamanioDatosFijos(valuesFromData[j], valuesLenght[j]) + "#"; } chain += aux.Remove(aux.Length - 1) + "|"; } else { IEnumerable <int> valuesFromData = retornarTamanioDatos(); foreach (var item in valuesFromData) { aux += Generador.hacerNuloDatos(item) + "~"; } chain += aux.Remove(aux.Length - 1) + "|"; } } return(chain); }
public void limpiar() { limpiarHijos(); datosNodo.Clear(); nodoLlaves.Clear(); Padre = Generador.hacerNulo(); }
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(); }
public bool hijosLlenos() { for (int i = 0; i < Hijos.Count; i++) { if (Hijos[i] == Generador.hacerNulo()) { return(false); } } return(true); }
public void insertarHijoUltimo(int hijo) { for (int i = 0; i < Hijos.Count; i++) { if (Hijos[i] == Generador.hacerNulo()) { Hijos[i] = hijo; return; } } }
public int obtenerUltimoHijo() { for (int i = Hijos.Count - 1; i >= 0; i--) { if (Hijos[i] != Generador.hacerNulo()) { return(Hijos[i]); } } return(Generador.hacerNulo()); }
public void insertarHijos(int posicion, int direccionHijo) { if (Hijos[posicion] != Generador.hacerNulo()) { for (int i = Hijos.Count - 1; i > posicionPrincipal; i--) { Hijos[i] = Hijos[i - 1]; } } Hijos[posicionPrincipal] = direccionHijo; }
public nodoB(int orden, int posicion, int tamanioMaximo) { nodoLlaves = new List <TKey>(); datosNodo = new List <TData>(); Hijos = new List <int>(); Orden = orden; Count = 0; Padre = Generador.hacerNulo(); posicionPrincipal = posicion; tamanioMaximoLlave = tamanioMaximo; limpiarHijos(); }
public static string armarEncabezado(string direccionRaiz, string ultimaDireccion, int ordenArbol, int altura) { string encabezado = ""; encabezado += direccionRaiz + Environment.NewLine; encabezado += ultimaDireccion + Environment.NewLine; encabezado += Generador.tamanioPosicionesFijas(Math.Abs(ordenArbol - 1)) + Environment.NewLine; encabezado += tamanioPosicionesFijas(ordenArbol) + Environment.NewLine; encabezado += tamanioPosicionesFijas(altura) + Environment.NewLine; return(encabezado); }
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); }
public void FixHijos(int posicionAMover) { if (!hijosLlenos()) { posicionAMover++; for (int i = Hijos.Count - 1; i > posicionAMover; i--) { Hijos[i] = Hijos[i - 1]; } Hijos[posicionAMover] = Generador.hacerNulo(); Count++; } }
public bool esHoja() { int esNulo = Generador.hacerNulo(); for (int i = 0; i < Hijos.Count; i++) { if (Hijos[i] != esNulo) { return(false); } } return(true); }
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 string listaCadenas(List <TKey> s) { string chain = ""; for (int i = 0; i < Orden - 1; i++) { if (i < s.Count) { chain += Generador.tamanioFijoLlaves(s[i].ToString(), tamanioMaximoLlave) + "|"; } else { chain += Generador.hacerNuloLlaves(tamanioMaximoLlave) + "|"; } } return(chain); }
private string stringOfList(List <int> s) { string chain = ""; for (int i = 0; i < Orden; i++) { if (i < s.Count) { chain += Generador.tamanioPosicionesFijas(s[i]) + "|"; } else { chain += Generador.hacerNulo() + "|"; } } return(chain); }
public void limpiarHijos() { if (Hijos.Count != 0) { for (int i = 0; i < Hijos.Count; i++) { Hijos[i] = Generador.hacerNulo(); } } else { for (int i = 0; i < Orden; i++) { Hijos.Add(Generador.hacerNulo()); } } }
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 static string tamanioPosicionesFijas(int posicion1) { string esNulo = Generador.hacerNulo().ToString(); if (posicion1.ToString().Length == esNulo.Length) { return(posicion1.ToString()); } else { string posicionNueva = posicion1.ToString(); for (int i = posicion1.ToString().Length; i < esNulo.Length; i++) { posicionNueva = "0" + posicionNueva; } return(posicionNueva); } }
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 List <TKey> hijosyvaloresActuales(TKey llaveAComparar, ref List <TData> datos, ref List <int> hijos) { int condition = nodoLlaves.Count; List <TKey> Maximuns = new List <TKey>(); for (int i = 0; i < condition; i++) { if (nodoLlaves[i].CompareTo(llaveAComparar) == 1) { Maximuns.Add(nodoLlaves[i]); datos.Add(datosNodo[i]); Hijos.Add(Hijos[i + 1]); Hijos[i + 1] = Generador.hacerNulo(); } } for (int i = 0; i < Maximuns.Count; i++) { nodoLlaves.Remove(Maximuns[i]); datosNodo.Remove(datos[i]); } return(Maximuns); }
public void insertarGrupoDeHijos(List <int> grupoHijos, int inicio, int posicionDeInsercion) { inicio++; for (int i = 0; i < grupoHijos.Count; i++) { Hijos.Add(Generador.hacerNulo()); } int temporal = 0; int GroupCount = 0; for (int i = inicio; i < Hijos.Count - 1; i++) { temporal = Hijos[i]; Hijos[i] = grupoHijos[GroupCount]; grupoHijos[GroupCount] = temporal; if (GroupCount == grupoHijos.Count) { GroupCount = 0; } } Hijos[Count - 1] = temporal; Hijos[inicio] = posicionDeInsercion; }
public List <TKey> HijosAndValuesToBrother(TKey llaveAComparar, ref List <TData> datos, ref List <int> hijos) { int condicionPrincipal = nodoLlaves.Count; List <TKey> maximos = new List <TKey>(); for (int i = 0; i < condicionPrincipal; i++) { if (nodoLlaves[i].CompareTo(llaveAComparar) == 1) { maximos.Add(nodoLlaves[i]); datos.Add(datosNodo[i]); Hijos.Add(Hijos[i]); Hijos[i] = Generador.hacerNulo(); } } Hijos.Add(Hijos[condicionPrincipal]); Hijos[condicionPrincipal] = Generador.hacerNulo(); for (int i = 0; i < maximos.Count; i++) { nodoLlaves.Remove(maximos[i]); datosNodo.Remove(datos[i]); } return(maximos); }
private int saltarEncabezado() { return((Generador.contadorCaracteresNulos() * 5) + (5 * 2)); }