public static List <T> Recorrido(T info1, int tipo = 0) { TemporalRecorrido = new List <T>(); var metaData = ManejarMeta(); DatosArboles.Instance.Grado = metaData[0]; if (metaData[1] != 0) { var Raiz = Nodo <T> .StringToNodo(metaData[1]); var continuar = true; switch (tipo) { case 0: InOrden(Raiz); break; case 1: Busqueda(Raiz, info1, ref continuar); break; } } return(TemporalRecorrido); }
public static void ModificarArbol(int newKey) { var metaData = ManejarMeta(); DatosArboles.Instance.Grado = metaData[0]; if (metaData[1] != 0) { var Raiz = Nodo <T> .StringToNodo(metaData[1]); RecorridoModificacion(Raiz, newKey); } }
public static void Modificar(T info, string[] nuevo, Delegate mod) { var metaData = ManejarMeta(); DatosArboles.Instance.Grado = metaData[0]; if (metaData[1] != 0) { var Raiz = Nodo <T> .StringToNodo(metaData[1]); var continuar = true; Modificar(Raiz, info, nuevo, mod, ref continuar); } }
static int BuscarRotar(Nodo <T> Padre, int indiceLista, int[] metadata) { var temporal = new Nodo <T>(1); if (indiceLista - 1 >= 0) { temporal = Nodo <T> .StringToNodo(Padre.Hijos[indiceLista - 1]); if (temporal.Valores.Count < temporal.cantV) { return(indiceLista - 1); } } if (indiceLista + 1 < Padre.Hijos.Count) { temporal = Nodo <T> .StringToNodo(Padre.Hijos[indiceLista + 1]); if (temporal.Valores.Count < temporal.cantV) { return(indiceLista + 1); } } if (indiceLista - 2 >= 0) { for (int i = indiceLista - 2; i >= 0; i--) { temporal = Nodo <T> .StringToNodo(Padre.Hijos[i]); if (temporal.Valores.Count < temporal.cantV) { return(i); } } } if (indiceLista + 2 < Padre.Hijos.Count) { for (int i = indiceLista + 2; i < Padre.Hijos.Count; i++) { temporal = Nodo <T> .StringToNodo(Padre.Hijos[i]); if (temporal.Valores.Count < temporal.cantV) { return(i); } } } return(indiceLista); }
static void Busqueda(Nodo <T> Actual, T info, ref bool continuar) { var pos = 0; while (continuar && pos < Actual.Valores.Count && (Actual.Valores[pos].CompareTo(info) == -1 || Actual.Valores[pos].CompareTo(info) == 0)) { if (Actual.Valores[pos].CompareTo(info) == 0) { continuar = false; TemporalRecorrido.Add(Actual.Valores[pos]); } pos++; } if (continuar && Actual.Hijos.Count != 0) { Busqueda(Nodo <T> .StringToNodo(Actual.Hijos[pos]), info, ref continuar); } }
static void Modificar(Nodo <T> Actual, T info, string[] nuevo, Delegate modificar, ref bool continuar) { var pos = 0; while (continuar && pos < Actual.Valores.Count && (Actual.Valores[pos].CompareTo(info) == -1 || Actual.Valores[pos].CompareTo(info) == 0)) { if (Actual.Valores[pos].CompareTo(info) == 0) { continuar = false; modificar.DynamicInvoke(Actual.Valores[pos], nuevo); Actual.NodoToString(); } pos++; } if (continuar && Actual.Hijos.Count != 0) { Modificar(Nodo <T> .StringToNodo(Actual.Hijos[pos]), info, nuevo, modificar, ref continuar); } }
static void InOrden(Nodo <T> Actual) { if (Actual.Hijos.Count == 0) { foreach (var dato in Actual.Valores) { TemporalRecorrido.Add(dato); } } else { var posDato = 1; foreach (var hijo in Actual.Hijos) { InOrden(Nodo <T> .StringToNodo(hijo)); if (posDato < Actual.Hijos.Count) { TemporalRecorrido.Add(Actual.Valores[posDato - 1]); posDato++; } } } }
static void RecorridoModificacion(Nodo <T> Actual, int newKey) { if (Actual.Hijos.Count == 0) { var aux = new Nodo <T>(Actual.Padre); aux.indice = Actual.indice; aux.Hijos = Actual.Hijos; foreach (var dato in Actual.Valores) { aux.Valores.Add(dato); } var last = DatosArboles.Instance.key; DatosArboles.Instance.key = newKey; aux.NodoToString(); DatosArboles.Instance.key = last; } else { var posDato = 1; var aux = new Nodo <T>(Actual.Padre); aux.indice = Actual.indice; aux.Hijos = Actual.Hijos; foreach (var hijo in Actual.Hijos) { RecorridoModificacion(Nodo <T> .StringToNodo(hijo), newKey); if (posDato < Actual.Hijos.Count) { aux.Valores.Add(Actual.Valores[posDato - 1]); posDato++; } } var last = DatosArboles.Instance.key; DatosArboles.Instance.key = newKey; aux.NodoToString(); DatosArboles.Instance.key = last; } }
static void Insertar(int indiceActual, ref T info, ref int hijo, ref int posHijo, ref bool TieneCarry, ref bool TieneHijo, ref bool first) { var metaData = ManejarMeta(); var Actual = Nodo <T> .StringToNodo(indiceActual); var pos = 0; if (Actual.Hijos.Count == 0) { while (pos < Actual.Valores.Count && Actual.Valores[pos].CompareTo(info) == -1) { pos++; } Actual.Valores.Insert(pos, info); } else { while (pos < Actual.Valores.Count && Actual.Valores[pos].CompareTo(info) == -1) { pos++; } Insertar(Actual.Hijos[pos], ref info, ref hijo, ref posHijo, ref TieneCarry, ref TieneHijo, ref first); } if (TieneCarry) { pos = 0; Actual = Nodo <T> .StringToNodo(Actual.indice); while (pos < Actual.Valores.Count && Actual.Valores[pos].CompareTo(info) == -1) { pos++; } Actual.Valores.Insert(pos, info); if (TieneHijo) { Actual.Hijos.Insert(posHijo, hijo); TieneHijo = false; } TieneCarry = false; } if (Actual.Valores.Count == Actual.cantV + 1) { if (Actual.Hijos.Count == 0 && Actual.Padre != 0) { var padre = Nodo <T> .StringToNodo(Actual.Padre); var indiceAct = padre.Hijos.IndexOf(Actual.indice); var indiceHer = BuscarRotar(padre, indiceAct, metaData); //var indiceDato = indiceAct == 0 ? 0 : indiceAct - 1; T datoTemporal = Actual.Valores[0]; var LlevaCarry = false; if (indiceHer < indiceAct) { var indiceDato = indiceAct == 0 ? 0 : indiceAct - 1; for (int i = indiceAct; i >= indiceHer; i--) { if (padre.Hijos[i] != Actual.indice) { Actual = Nodo <T> .StringToNodo(padre.Hijos[i]); } if (LlevaCarry) { padre.Valores.Insert(indiceDato, datoTemporal); datoTemporal = padre.Valores[indiceDato + 1]; padre.Valores.RemoveAt(indiceDato + 1); padre.NodoToString(); Actual.Valores.Add(datoTemporal); datoTemporal = Actual.Valores[0]; if (i != indiceHer) { Actual.Valores.RemoveAt(0); } indiceDato--; } else { datoTemporal = Actual.Valores[0]; Actual.Valores.RemoveAt(0); } Actual.NodoToString(); LlevaCarry = true; } } else if (indiceHer > indiceAct) { var indiceDato = indiceAct == padre.Hijos.Count() - 1 ? indiceAct - 1 : indiceAct; for (int i = indiceAct; i <= indiceHer; i++) { if (padre.Hijos[i] != Actual.indice) { Actual = Nodo <T> .StringToNodo(padre.Hijos[i]); } if (LlevaCarry) { padre.Valores.Insert(indiceDato, datoTemporal); datoTemporal = padre.Valores[indiceDato + 1]; padre.Valores.RemoveAt(indiceDato + 1); padre.NodoToString(); Actual.Valores.Insert(0, datoTemporal); datoTemporal = Actual.Valores[Actual.Valores.Count - 1]; if (i != indiceHer) { Actual.Valores.RemoveAt(Actual.Valores.Count - 1); } indiceDato++; } else { datoTemporal = Actual.Valores[Actual.Valores.Count - 1]; Actual.Valores.RemoveAt(Actual.Valores.Count - 1); } Actual.NodoToString(); LlevaCarry = true; } } else { var indiceDato = indiceAct == 0 ? 0 : indiceAct - 1; indiceHer = indiceAct - 1 >= 0 ? indiceAct - 1 : indiceAct + 1; var hermano = Nodo <T> .StringToNodo(padre.Hijos[indiceHer]); var listaTemporal = new List <T>(); var temporal = new Nodo <T>(padre.indice) { indice = metaData[2], Valores = new List <T>(), Hijos = new List <int>() }; if (indiceAct - 1 == indiceHer) { foreach (var item in hermano.Valores) { listaTemporal.Add(item); } listaTemporal.Add(padre.Valores[indiceDato]); foreach (var item in Actual.Valores) { listaTemporal.Add(item); } var cantDividida = (listaTemporal.Count - 2) / 3; temporal.Valores.AddRange(listaTemporal.GetRange(0, cantDividida)); listaTemporal.RemoveRange(0, cantDividida); padre.Valores.RemoveAt(indiceDato); padre.Valores.Insert(indiceDato, listaTemporal[0]); listaTemporal.RemoveAt(0); hermano.Valores.Clear(); hermano.Valores.AddRange(listaTemporal.GetRange(0, cantDividida)); listaTemporal.RemoveRange(0, cantDividida); padre.Valores.Insert(indiceDato + 1, listaTemporal[0]); listaTemporal.RemoveAt(0); Actual.Valores.Clear(); Actual.Valores.AddRange(listaTemporal.GetRange(0, cantDividida)); indiceHer = indiceAct - 1 >= 0 ? indiceAct - 1 : indiceAct + 2; padre.Hijos.Insert(indiceHer, temporal.indice); } else { foreach (var item in Actual.Valores) { listaTemporal.Add(item); } listaTemporal.Add(padre.Valores[indiceDato]); foreach (var item in hermano.Valores) { listaTemporal.Add(item); } var cantDividida = (listaTemporal.Count - 2) / 3; Actual.Valores.Clear(); Actual.Valores.AddRange(listaTemporal.GetRange(0, cantDividida)); listaTemporal.RemoveRange(0, cantDividida); padre.Valores.RemoveAt(indiceDato); padre.Valores.Insert(indiceDato, listaTemporal[0]); listaTemporal.RemoveAt(0); hermano.Valores.Clear(); hermano.Valores.AddRange(listaTemporal.GetRange(0, cantDividida)); listaTemporal.RemoveRange(0, cantDividida); padre.Valores.Insert(indiceDato + 1, listaTemporal[0]); listaTemporal.RemoveAt(0); temporal.Valores.AddRange(listaTemporal.GetRange(0, cantDividida)); padre.Hijos.Insert(indiceHer + 1, temporal.indice); } if (padre.Valores.Count > padre.cantV) { info = padre.Valores[0]; padre.Valores.RemoveAt(0); posHijo = padre.Hijos.IndexOf(temporal.indice); padre.Hijos.RemoveAt(posHijo); hijo = temporal.indice; TieneCarry = true; TieneHijo = true; } temporal.NodoToString(); padre.NodoToString(); hermano.NodoToString(); metaData[2]++; ManejarMeta(metaData); } } else { metaData = ManejarMeta(); var posMedia = Actual.Valores.Count % 2 == 0 ? (Actual.Valores.Count - 1) / 2 : Actual.Valores.Count / 2; var padreHermano = Actual.Padre == 0 ? metaData[2] + 1 : Actual.Padre; var Hermano = new Nodo <T>(padreHermano) { indice = metaData[2], Valores = Actual.Valores.GetRange(0, posMedia) }; metaData[2]++; if (Actual.Hijos.Count != 0) { Hermano.Hijos = Actual.Hijos.GetRange(0, posMedia + 1); Actual.Hijos.RemoveRange(0, posMedia + 1); foreach (var indiceHijo in Hermano.Hijos) { var Hijo = Nodo <T> .StringToNodo(indiceHijo); Hijo.Padre = Hermano.indice; Hijo.NodoToString(); } } if (Actual.Padre == 0) { var padre = new Nodo <T>(0) { Valores = new List <T> { Actual.Valores[posMedia] }, Hijos = new List <int> { Hermano.indice, Actual.indice }, indice = metaData[2] }; metaData[1] = metaData[2]; metaData[2]++; padre.NodoToString(); Hermano.Padre = padre.indice; Actual.Padre = padre.indice; } else { var padre = Nodo <T> .StringToNodo(Actual.Padre); info = Actual.Valores[posMedia]; pos = 0; while (pos < padre.Valores.Count && padre.Valores[pos].CompareTo(info) == -1) { pos++; } padre.Valores.Insert(pos, info); padre.Hijos.Insert(padre.Hijos.IndexOf(Actual.indice), Hermano.indice); if (padre.Valores.Count > padre.cantV) { info = padre.Valores[0]; padre.Valores.RemoveAt(0); posHijo = padre.Hijos.IndexOf(Hermano.indice); padre.Hijos.RemoveAt(posHijo); hijo = Hermano.indice; TieneCarry = true; TieneHijo = true; } padre.NodoToString(); //Primer metodo //while (pos < padre.Valores.Count && padre.Valores[pos].CompareTo(info) == -1) //{ // pos++; //} //padre.Valores.Insert(pos, info); //if (padre.Valores.Count <= padre.cantV) //{ // padre.Hijos.Insert(padre.Hijos.IndexOf(Actual.indice), Hermano.indice); // padre.NodoToString(); //} //else //{ // TieneCarry = true; //} } Actual.Valores.RemoveRange(0, posMedia + 1); Actual.NodoToString(); Hermano.NodoToString(); ManejarMeta(metaData); } } if (first) { Actual.NodoToString(); first = false; } }