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 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; } }
public static void InsertarArbol(T info) { /*METADATA * [0] = Grado * [1] = Raiz * [2] = Posicion siguiente */ var metaData = ManejarMeta(); DatosArboles.Instance.Grado = metaData[0]; if (metaData[1] == 0) { metaData[1]++; metaData[2]++; var nodo = new Nodo <T>(0) { indice = 1, Valores = new List <T> { info }, Hijos = new List <int>() }; nodo.NodoToString(); ManejarMeta(metaData); } else { var carry = false; var carryHijo = false; var IsFirst = true; var Hijo = 0; var posHijo = 0; Insertar(metaData[1], ref info, ref Hijo, ref posHijo, ref carry, ref carryHijo, ref IsFirst); } }
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; } }