예제 #1
0
        public async Task <string> Insertar(int value)
        {
            Tuple <Pagina, Nodo> pin = await raiz.Buscar(value);

            Nodo nodo = pin.Item2; Pagina pagina = pin.Item1;

            if (nodo != null)
            {
                return(string.Format("Valor {0} ya existe", value));
            }
            else
            {
                await pagina.Insertar(value);

                if (raiz.PaginaPadre != null)
                {
                    raiz = raiz.PaginaPadre;
                }
                await raiz.reajustarPocision(true);

                return(string.Format("Valor {0} insertado", value));
            }
        }
예제 #2
0
        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();
        }