public async Task dividir() { if (nodos.Count() <= BTree.D) { return; } Pagina iPagina = PaginaPadre == null ? this : PaginaPadre; PaginaHijo lHijo = new PaginaHijo(iPagina), rHijo = new PaginaHijo(iPagina); Pagina lPagina = new Pagina(lHijo), rPagina = new Pagina(rHijo); int mitad = nodos.Count / 2; Nodo mitadNodo = nodos[mitad]; Puntero lPointer = new Puntero(mitad) { PaginaPadre = iPagina }, rPointer = new Puntero(mitad + 1) { PaginaPadre = iPagina }; await lPointer.actualizar(); await rPointer.actualizar(); for (int i = 0; i < mitad; i++) { lPagina.nodos.Add(nodos[i]); nodos[i].PaginaPadre = lPagina; lPagina.hijos.Add(hijos[i]); hijos[i].paginaPadre = lPagina; hijos[i].puntero.PaginaPadre = lPagina; } lPagina.hijos.Add(hijos[mitad]); hijos[mitad].paginaPadre = lPagina; hijos[mitad].puntero.PaginaPadre = lPagina; for (int i = mitad + 1; i < nodos.Count; i++) { rPagina.nodos.Add(nodos[i]); nodos[i].PaginaPadre = rPagina; rPagina.hijos.Add(hijos[i]); hijos[i].paginaPadre = rPagina; hijos[i].puntero.PaginaPadre = rPagina; nodos[i].Indice = i - mitad - 1; hijos[i].puntero.Indice = i - mitad - 1; } rPagina.hijos.Add(hijos.Last()); hijos.Last().paginaPadre = rPagina; hijos.Last().puntero.PaginaPadre = rPagina; hijos.Last().puntero.Indice = hijos.Count - mitad - 2; lHijo.pagina = lPagina; rHijo.pagina = rPagina; rHijo.pagina.MouseDown += (s, e) => { }; lHijo.puntero = lPointer; rHijo.puntero = rPointer; nodos.Clear(); hijos.Clear(); if (PaginaPadre == null) { mitadNodo.Indice = 0; iPagina.nodos.Add(mitadNodo); lPointer.Indice = 0; rPointer.Indice = 1; iPagina.hijos.Add(lHijo); iPagina.hijos.Add(rHijo); iPagina.actualizarJerarquia(); await Task.WhenAll(iPagina.actualizarElementosVista(true), lPagina.actualizarElementosVista(true), rPagina.actualizarElementosVista(true), iPagina.reajustarPocision(true)); } else { await iPagina.Insertar_Nodo(mitadNodo, lHijo, rHijo); iPagina.UpdateLayout(); iPagina.actualizarJerarquia(); await Task.WhenAll(iPagina.reajustarPocision(true), lPagina.actualizarElementosVista(true), rPagina.actualizarElementosVista(true)); if (PaginaPadre != null) { ((Canvas)Parent).Children.Remove(this); } } await iPagina.dividir(); }
public async Task Insertar_Nodo(Nodo nodo, PaginaHijo previo = null, PaginaHijo siguiente = null) { int valor = nodo.Value; Puntero pizquierdo, pderecho; if (previo == null) { pizquierdo = new Puntero(0); pderecho = new Puntero(1); previo = new PaginaHijo(this) { puntero = pizquierdo }; siguiente = new PaginaHijo(this) { puntero = pderecho }; } else { pizquierdo = previo.puntero; pderecho = siguiente.puntero; } previo.paginaPadre = siguiente.paginaPadre = nodo.PaginaPadre = pizquierdo.PaginaPadre = pderecho.PaginaPadre = this; if (nodos.Count() == 0) { foreach (var hijo in hijos) { Children.Remove(hijo.puntero); } hijos.Clear(); UpdateLayout(); nodo.Indice = 0; pizquierdo.Indice = 0; pderecho.Indice = 1; nodos.Add(nodo); hijos.Add(previo); hijos.Add(siguiente); await Task.WhenAll(reajustarPocision(true), actualizarElementosVista()); } else { int i = 0; for (i = 0; i < nodos.Count(); i++) { if (nodos[i].Value >= valor) { break; } } nodo.Indice = i; pizquierdo.Indice = i; pderecho.Indice = i + 1; if (i < nodos.Count()) { if (nodos[i].Value == valor) { return; } Children.Remove(hijos[i].puntero); hijos[i] = siguiente; pderecho.Indice--; await Task.WhenAll(pizquierdo.actualizar(), pderecho.actualizar()); List <Task> tarea = new List <Task>(); for (int j = i; j < nodos.Count(); j++) { tarea.Add(nodos[j].incrementoProgreso(1)); tarea.Add(hijos[j].puntero.incrementoProgreso(1)); } tarea.Add(hijos.Last().puntero.incrementoProgreso(1)); hijos.Insert(i, previo); nodos.Insert(i, nodo); nodo.Indice = i; tarea.Add(reajustarPocision(true)); tarea.Add(actualizarElementosVista()); await Task.WhenAll(tarea); } else { Children.Remove(hijos[i].puntero); hijos[i] = previo; hijos.Insert(i + 1, siguiente); nodos.Insert(i, nodo); nodo.Indice = i; actualizarJerarquia(); await Task.WhenAll(reajustarPocision(true), actualizarElementosVista()); } } }