public void sucesor(ref Pagina actual, int k)
        {
            Pagina q;

            q = actual.ramas[k];
            while (q.ramas[0] != null)
            {
                q = q.ramas[0];
            }
            actual.claves[k] = q.claves[1];
            //q.claves[1] = null;
            actual.ramas[k] = q;
        }
        public void quitar(ref Pagina actual, int k)
        {
            int j;

            for (j = k + 1; j <= actual.cuenta; j++)
            {
                actual.claves[j - 1] = actual.claves[j];
                actual.claves[j]     = null;
                actual.ramas[j - 1]  = actual.ramas[j];
                actual.ramas[j]      = null;
            }
            actual.cuenta--;
        }
        public void meterHoja(ref Pagina actual, ref nodo cl, ref Pagina rd, int k)
        {
            int i;

            for (i = actual.cuenta; i >= k + 1; i--)
            {
                actual.claves[i + 1] = actual.claves[i];
                actual.ramas[i + 1]  = actual.ramas[i];

                actual.claves[i] = null;
                actual.ramas[i]  = null;
            }
            actual.claves[k + 1] = cl;
            actual.ramas[i + 1]  = rd;
            actual.cuenta++;
        }
        public string getClaves(Pagina pag)
        {
            if (pag.cuenta == 0)
            {
                return(null);
            }

            string res = "\"|";

            for (int i = 0; i < 5; i++)
            {
                res += pag.claves[i] == null ? "     " : pag.claves[i].transactionID;
                res += "|";
            }
            res += "\"";
            return(res);
        }
        public void insertar(ref Pagina raiz, nodo cl)
        {
            bool   subeArriba = false;
            nodo   mediana = null;
            Pagina p, nd = null;

            empujar(ref raiz, cl, ref subeArriba, ref mediana, ref nd);

            if (subeArriba)
            {
                p           = new Pagina(this.orden);
                p.cuenta    = 1;
                p.claves[1] = mediana;
                p.ramas[0]  = raiz;
                p.ramas[1]  = nd;
                raiz        = p;
            }
        }
 public void eliminarActivo(ref Pagina pag, string activo, ref bool eliminado)
 {
     for (int i = 0; i < 5; i++)
     {
         if (pag != null && pag.claves[i] != null && pag.claves[i].assetID.Equals(activo))
         {
             eliminar(ref pag, pag.claves[i]);
             eliminado = true;
         }
     }
     for (int i = 0; i < 5; i++)
     {
         if (pag != null && pag.ramas[i] != null)
         {
             eliminarActivo(ref pag.ramas[i], activo, ref eliminado);
         }
     }
 }
        public void eliminar(ref Pagina raiz, nodo cl)
        {
            bool encontrado = false;

            eliminarRegistro(ref raiz, cl, ref encontrado);
            if (encontrado)
            {
                System.Console.WriteLine("Clave %s eliminada\n", cl.transactionID);
                if (raiz.cuenta == 0)
                {
                    Pagina p = raiz;
                    raiz = raiz.ramas[0];
                }
            }
            else
            {
                System.Console.WriteLine("La clave no se encuentra en el arbol\n");
            }
        }
        public bool buscarNodo(ref Pagina actual, nodo cl, ref int k)
        {
            bool encontrado;

            if (strcmp(cl.transactionID, actual.claves[1].transactionID) < 0)
            {
                encontrado = false;
                k          = 0;
            }
            else
            {
                k = actual.cuenta;
                while (actual.claves[k].transactionID != null && (strcmp(cl.transactionID, actual.claves[k].transactionID) < 0) && (k > 1))
                {
                    (k)--;
                }

                encontrado = (strcmp(cl.transactionID, actual.claves[k].transactionID) == 0);
            }
            return(encontrado);
        }
        public string dibujaArbol(Pagina actual)
        {
            string res = "text: { name: '|";

            for (int i = 0; i < 5; i++)
            {
                res += actual.claves[i] == null ? " " : actual.claves[i].transactionID;
                res += "|";
            }
            res += "'}";
            bool primero = true;

            for (int j = 0; j < 5; j++)
            {
                if (actual.ramas[j] != null)
                {
                    if (primero)
                    {
                        res += ",children: [ ";
                    }

                    res    += "{";
                    primero = false;
                    res    += dibujaArbol(actual.ramas[j]);

                    res += "}";

                    if (actual.ramas.Count() > (j + 1) && actual.ramas[j + 1] != null)
                    {
                        res += ",";
                    }
                }
            }
            if (!primero)
            {
                res += "]";
            }

            return(res);
        }
        public void empujar(ref Pagina actual, nodo cl, ref bool subeArriba, ref nodo mediana, ref Pagina nuevo)
        {
            int k = 0;

            if (actual == null)
            {
                subeArriba = true;
                mediana    = cl;
                nuevo      = null;
            }
            else
            {
                bool esta;
                esta = buscarNodo(ref actual, cl, ref k);

                if (esta)
                {
                    System.Console.WriteLine("\nClave duplicada");
                    subeArriba = false;
                    return;
                }

                empujar(ref actual.ramas[k], cl, ref subeArriba, ref mediana, ref nuevo);


                if (subeArriba)
                {
                    if (nodoLLeno(actual))
                    {
                        dividirNodo(ref actual, ref mediana, ref nuevo, k, ref mediana, ref nuevo);
                    }
                    else
                    {
                        subeArriba = false;
                        meterHoja(ref actual, ref mediana, ref nuevo, k);
                    }
                }
            }
        }
        public string graficarArbol(Pagina actual)
        {
            string res    = "";
            string claves = getClaves(actual);

            for (int j = 0; j < 5; j++)
            {
                if (actual.ramas[j] != null)
                {
                    string rama = getClaves(actual.ramas[j]);

                    if (!string.IsNullOrEmpty(rama))
                    {
                        res += " " + claves + " -- " + rama + ";";
                    }

                    res += graficarArbol(actual.ramas[j]);
                }
            }

            return(res);
        }
        public void dividirNodo(ref Pagina actual, ref nodo cl, ref Pagina rd, int k, ref nodo mediana, ref Pagina nuevo)
        {
            int i, claveMedia;

            claveMedia = (k <= this.orden / 2) ? this.orden / 2 : this.orden / 2 + 1;
            if (nuevo == null)
            {
                nuevo = new Pagina(5);
            }

            for (i = claveMedia + 1; i < this.orden; i++)
            {
                nuevo.claves[i - claveMedia] = actual.claves[i];
                nuevo.ramas[i - claveMedia]  = actual.ramas[i];

                actual.claves[i] = null;
                actual.ramas[i]  = null;
            }
            nuevo.cuenta  = (this.orden - 1) - claveMedia;
            actual.cuenta = claveMedia;

            Pagina nula = null;

            if (k <= this.orden / 2)
            {
                meterHoja(ref actual, ref cl, ref nula, k);
            }
            else
            {
                meterHoja(ref nuevo, ref cl, ref nula, k - claveMedia);
            }


            mediana        = actual.claves[actual.cuenta];
            nuevo.ramas[0] = actual.ramas[actual.cuenta];
            actual.ramas[actual.cuenta]  = null;
            actual.claves[actual.cuenta] = null;
            actual.cuenta--;
        }
        public void moverDrcha(ref Pagina actual, int k)
        {
            int j;

            Pagina nodoProblema = actual.ramas[k];
            Pagina nodoIzqdo    = actual.ramas[k - 1];

            for (j = nodoProblema.cuenta; j >= 1; j--)
            {
                nodoProblema.claves[j + 1] = nodoProblema.claves[j];
                nodoProblema.ramas[j + 1]  = nodoProblema.ramas[j];

                nodoProblema.claves[j] = null;
                nodoProblema.ramas[j]  = null;
            }
            nodoProblema.cuenta++;
            nodoProblema.ramas[1]  = nodoProblema.ramas[0];
            nodoProblema.claves[1] = actual.claves[k];

            actual.claves[k]      = nodoIzqdo.claves[nodoIzqdo.cuenta];
            nodoProblema.ramas[0] = nodoIzqdo.ramas[nodoIzqdo.cuenta];
            nodoIzqdo.cuenta--;
        }
        public void eliminarRegistro(ref Pagina actual, nodo cl, ref bool encontrado)
        {
            int k = 0;

            if (actual != null)
            {
                encontrado = buscarNodo(ref actual, cl, ref k);
                if (encontrado)
                {
                    if (actual.ramas[k - 1] == null)
                    {
                        quitar(ref actual, k);
                    }
                    else
                    {
                        sucesor(ref actual, k);
                        eliminarRegistro(ref actual.ramas[k], actual.claves[k], ref encontrado);
                    }
                }
                else
                {
                    eliminarRegistro(ref actual.ramas[k], cl, ref encontrado);
                }

                if (actual.ramas[k] != null)
                {
                    if (actual.ramas[k].cuenta < this.orden / 2)
                    {
                        restablecer(ref actual, k);
                    }
                }
            }
            else
            {
                encontrado = false;
            }
        }
        public void restablecer(ref Pagina actual, int k)
        {
            if (k > 0)
            {
                if (actual.ramas[k - 1].cuenta > this.orden / 2)
                {
                    moverDrcha(ref actual, k);
                }
                else
                {
                    combina(ref actual, k);
                }
            }

            else
            if (actual.ramas[1].cuenta > this.orden / 2)
            {
                moverIzqda(ref actual, 1);
            }
            else
            {
                combina(ref actual, 1);
            }
        }
 public Pagina(int orden)
 {
     this.orden = orden;
     claves     = new nodo[this.orden];
     ramas      = new Pagina[this.orden];
 }
 public bool nodoLLeno(Pagina actual)
 {
     return(actual.cuenta == this.orden - 1);
 }
 public ArbolB(int _orden)
 {
     this.orden  = _orden;
     ArbolB.raiz = null;
 }