public bool paginaLlena(Pagina actual) { if (actual.cuenta == m - 1) { return(true); } else { return(false); } }
public bool paginaSemiLlena(Pagina actual) { if (actual.cuenta < m / 2) { return(true); } else { return(false); } }
public void meterHoja(Pagina actual, HistorialMov hm, Pagina rd, int k) { int i; /*desplaza a la derecha los elementos para hcer un hueco*/ for (i = actual.cuenta; i >= k + 1; i--) { actual.claves[i + 1] = actual.claves[i]; actual.ramas[i + 1] = actual.ramas[i]; } actual.claves[k + 1] = hm; actual.ramas[k + 1] = rd; actual.cuenta++; }
public void insertar(ref Pagina raiz, HistorialMov hm) { bool subeArriba = false; HistorialMov mediana = null; Pagina p = null; Pagina nd = null; empujar(raiz, hm, ref subeArriba, ref mediana, ref nd); if (subeArriba) { p = new Pagina(orden); p.cuenta = 1; p.claves[1] = mediana; p.ramas[0] = raiz; p.ramas[1] = nd; raiz = p; } }
public Pagina buscar(Pagina actual, HistorialMov hm, ref int k) { if (actual == null) { return(null); } else { bool esta = false; esta = buscarPagina(actual, hm, ref k); if (esta) { return(actual); } else { return(buscar(actual.ramas[k], hm, ref k)); } } }
public void imprimir(Pagina actual, ref string acum, ref string enlace) { acum += actual.GetHashCode().ToString() + "[label=\""; acum += "<r0>"; if (actual.ramas[0] != null) { enlace += "\"" + actual.GetHashCode().ToString() + "\":r0 ->"; enlace += "\"" + actual.ramas[0].GetHashCode().ToString() + "\"\n"; } for (int i = 1; i <= actual.cuenta; i++) { acum += "|"; acum += "<c" + i.ToString() + "> " + actual.claves[i].idAtaque.ToString() + "\\n emisor: " + actual.claves[i].idEmisor + "\\n receptor: " + actual.claves[i].idReceptor + "\\n CordX" + actual.claves[i].coordenadaX.ToString() + "\\n CordY" + actual.claves[i].coordenadaY.ToString(); acum += "|<r" + i.ToString() + ">"; if (actual.ramas[i] != null) { enlace += "\"" + actual.GetHashCode().ToString() + "\":r" + i.ToString() + " -> "; enlace += "\"" + actual.ramas[i].GetHashCode().ToString() + "\"\n"; } } acum += "\"];\n"; }
public void dividirNodo(Pagina actual, HistorialMov hm, Pagina rd, int k, ref HistorialMov mediana, ref Pagina nuevo) { int i, posMdna; if (k <= orden / 2) { posMdna = orden / 2; } else { posMdna = orden / 2 + 1; } nuevo = new Pagina(orden); for (i = posMdna + 1; i < orden; i++) { /* es desplzada la mida derecha al nuevo nodo, la clave mediana se queda en el nodo origen*/ nuevo.claves[i - posMdna] = actual.claves[i]; nuevo.ramas[i - posMdna] = actual.ramas[i]; } nuevo.cuenta = (orden - 1) - posMdna; /* claves en el nuevo nodo*/ actual.cuenta = posMdna; //claves en el nodo origen /* es insertada la clave y rama en el nodo que le corresponde*/ if (k <= orden / 2) { meterHoja(actual, hm, rd, k); /* inserta en el nodo origen*/ } else { meterHoja(nuevo, hm, rd, k - posMdna); } /* se extrae clave mediana del nodo origen*/ mediana = actual.claves[actual.cuenta]; /* Rama0 del nuevo nodo es la rama de la mediana*/ nuevo.ramas[0] = actual.ramas[actual.cuenta]; actual.cuenta--; /* disminuye ya que se quieta la mediana*/ }
public ArbolB(int orden) { this.orden = orden; this.raiz = null; }
public void empujar(Pagina actual, HistorialMov hm, ref bool subeArriba, ref HistorialMov mediana, ref Pagina nuevo) { int k = 0; if (actual == null) { subeArriba = true; mediana = hm; nuevo = null; } else { bool esta; esta = buscarPagina(actual, hm, ref k); if (esta) { Console.WriteLine("Clave duplicada: " + hm.idAtaque); subeArriba = false; return; } empujar(actual.ramas[k], hm, ref subeArriba, ref mediana, ref nuevo); if (subeArriba) { if (actual.paginaLlena(actual)) { dividirNodo(actual, mediana, nuevo, k, ref mediana, ref nuevo); } else { subeArriba = false; meterHoja(actual, mediana, nuevo, k); } } } }