예제 #1
0
 public bool paginaLlena(Pagina actual)
 {
     if (actual.cuenta == m - 1)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
예제 #2
0
 public bool paginaSemiLlena(Pagina actual)
 {
     if (actual.cuenta < m / 2)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
예제 #3
0
        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++;
        }
예제 #4
0
        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;
            }
        }
예제 #5
0
 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));
         }
     }
 }
예제 #6
0
 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";
 }
예제 #7
0
        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*/
        }
예제 #8
0
 public ArbolB(int orden)
 {
     this.orden = orden;
     this.raiz  = null;
 }
예제 #9
0
        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);
                    }
                }
            }
        }