public void Insertar(T valor) { Raiz = BReader <T> .LeerRaiz(RutaArbol); if (Raiz == int.MinValue) { NodoB <T> nodo = new NodoB <T>(TamañoT, Grado, PosicionDisponible); nodo.Valores[0] = valor; BWriter <T> .EscribirNodo(RutaArbol, nodo, PosicionDisponible); Raiz = nodo.posicion; BWriter <T> .EscribirRaiz(RutaArbol, Raiz); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); } else { int posicionNodo = BuscarPosicion(valor, GuardarNodo(BReader <T> .LeerNodo(RutaArbol, Raiz))); if (posicionNodo != int.MaxValue) { NodoB <T> Nodo = GuardarNodo(BReader <T> .LeerNodo(RutaArbol, posicionNodo)); InsertarValor(valor, ref Nodo); BWriter <T> .EscribirNodo(RutaArbol, Nodo, Nodo.posicion); if (Nodo.Valores[Grado - 1] != null) { SepararNodo(Nodo); } } } }
public void Insertar(T valor, Delegate delegado) { BReader <T> .LeerEncabezado(RutaArbol, ref Raiz, ref PosicionDisponible); if (Raiz == int.MinValue) { NodoB <T> nuevo = new NodoB <T>(valor.FixedSizeText, Grado); nuevo.Valores.Add(valor); BWriter.Escribir() } else { NodoB <T> aux = Raiz; for (int i = 0; i < Grado - 1; i++) { if ((int)delegado.DynamicInvoke(aux.Valores[i], valor) == -1) { } else if ((int)delegado.DynamicInvoke(aux.Valores[i], valor) == 1) { } } if (nuevo.Valores.Count == Grado) { Ordenar } } }
public Arbol_BAsterisco(int grado, string ruta) { Grado = grado; Raiz = int.MinValue; PosicionDisponible = 1; RutaArbol = ruta; BWriter.Escribir(Raiz.ToString("00000000000;-0000000000"), RutaArbol); BWriter.Escribir(PosicionDisponible.ToString("00000000000;-0000000000"), RutaArbol); }
public ArbolB(int grado, string ruta, string archivo, int tamañoValor, Func <string, T> funcion, Func <string> nullFormat, Delegate comp1, Delegate comp2) { Grado = grado; Raiz = int.MinValue; PosicionDisponible = 1; BWriter <T> .EvaluarRuta(ruta); RutaArbol = ruta + archivo; TamañoT = tamañoValor; ConvertToT = funcion; ToTNullFormat = nullFormat; comparador1 = comp1; comparador2 = comp2; BWriter <T> .EscribirRaiz(RutaArbol, int.MinValue); BWriter <T> .EscribirPosicionDisponible(RutaArbol, 1); }
public void RepartirHijos(NodoB <T> nodo, NodoB <T> hermano, int posicionMedia) { int x = 0; for (int i = posicionMedia + 1; i < nodo.hijos.Length; i++) { hermano.hijos[x] = nodo.hijos[i]; nodo.hijos[i] = int.MinValue; x++; } for (int i = 0; i < hermano.hijos.Length; i++) { if (hermano.hijos[i] != int.MinValue) { NodoB <T> temp = GuardarNodo(BReader <T> .LeerNodo(RutaArbol, hermano.hijos[i])); temp.Padre = hermano.posicion; BWriter <T> .EscribirNodo(RutaArbol, temp, temp.posicion); } } }
public void SepararNodo(NodoB <T> nodo) { if (nodo.Valores[Grado - 1] != null) { if (nodo.Padre == int.MinValue) { int posicionMedia = Grado / 2; T valorASubir = nodo.Valores[posicionMedia]; NodoB <T> hermano = new NodoB <T>(TamañoT, Grado, PosicionDisponible); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); NodoB <T> padre = new NodoB <T>(TamañoT, Grado, PosicionDisponible); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); Raiz = padre.posicion; BWriter <T> .EscribirRaiz(RutaArbol, Raiz); hermano.Padre = padre.posicion; nodo.Padre = padre.posicion; RepartirValores(posicionMedia, ref nodo, ref hermano); if (!VerSiEsHoja(nodo)) { RepartirHijos(nodo, hermano, posicionMedia); } BWriter <T> .EscribirNodo(RutaArbol, hermano, hermano.posicion); BWriter <T> .EscribirNodo(RutaArbol, nodo, nodo.posicion); InsertarValor(valorASubir, ref padre); padre.hijos[0] = nodo.posicion; padre.hijos[1] = hermano.posicion; BWriter <T> .EscribirNodo(RutaArbol, padre, padre.posicion); } else { int posicionMedia = Grado / 2; T valorASubir = nodo.Valores[posicionMedia]; NodoB <T> hermano = new NodoB <T>(TamañoT, Grado, PosicionDisponible); PosicionDisponible++; BWriter <T> .EscribirPosicionDisponible(RutaArbol, PosicionDisponible); NodoB <T> padre = GuardarNodo(BReader <T> .LeerNodo(RutaArbol, nodo.Padre)); hermano.Padre = padre.posicion; RepartirValores(posicionMedia, ref nodo, ref hermano); if (!VerSiEsHoja(nodo)) { RepartirHijos(nodo, hermano, posicionMedia); } BWriter <T> .EscribirNodo(RutaArbol, hermano, hermano.posicion); BWriter <T> .EscribirNodo(RutaArbol, nodo, nodo.posicion); InsertarValor(valorASubir, ref padre); bool hijoEncontrado = false; int posicionHijo = int.MinValue; int temp = int.MinValue; for (int i = 0; i < padre.hijos.Length; i++) { if (hijoEncontrado) { if (i == posicionHijo + 1) { temp = padre.hijos[i]; padre.hijos[i] = hermano.posicion; } else { int temp2 = padre.hijos[i]; padre.hijos[i] = temp; temp = temp2; } } else { if (padre.hijos[i] == nodo.posicion) { hijoEncontrado = true; posicionHijo = i; } } } if (padre.hijos[Grado] != int.MinValue) { SepararNodo(padre); } else { BWriter <T> .EscribirNodo(RutaArbol, padre, padre.posicion); } } } }