public BinomialTree(BinomialTree nodocopia)
 {
     this.nodohermano = nodocopia.nodohermano;
     this.nodopadre = nodocopia.nodopadre;
     this.valor = nodocopia.Valor;
     this.nodohijo = nodocopia.nodohijo;
 }
        public void ActualizarLocalidad(int x, int y, BinomialTree raiz)
        {
            if (raiz != null)
            {
                raiz.xcentro = x + radio;
                raiz.ycentro = y + radio;
                raiz.rectangulo.Location = new Point(x, y);
                if (nodohijo.Count > 0)
                {

                    for (int a = 0; a < nodohijo.Count; a++)
                    {
                        if (a > 2)
                            nodohijo[a].ActualizarLocalidad(x + (int)Math.Pow(2, a - 3) * x + nodohijo[a - 1].rectangulo.X, y + 4 * radio, nodohijo[a]);
                        else
                            nodohijo[a].ActualizarLocalidad(x + (a * 2 * radio), y + 4 * radio, nodohijo[a]);
                    }
                }
            }
        }
 //Por defecto
 public BinomialTree()
 {
     this.nodopadre = null;
     this.nodohermano = null;
 }
 public void Ordenar(BinomialTree raiz)
 {
     if (raiz.nodohijo.Count > 1)
     {
         raiz.nodohijo.Sort(delegate (BinomialTree a1, BinomialTree a2) { return a1.Grado.CompareTo(a2.Grado); });
         foreach (BinomialTree abw in raiz.nodohijo)
             abw.Ordenar(abw);
     }
 }
        public void DisminuirClave(int valornodo, int datonuevo, Graphics g, BinomialTree ab)
        {
            if (valornodo == ab.valor)//Se ha llegado al nodo destino
            {
                ab.valor = datonuevo;
                ab.visitado = true;
                if (ab.nodopadre != null)
                    ab.nodopadre.visitado = true;
                if (ab.nodohijo.Count > 0)
                    ab.nodohijo[0].visitado = true;
                ab.Dibujar(g, ab);
                Thread.Sleep(tiempo);
                ab.visitado = false;
                if (ab.nodopadre != null)
                    ab.nodopadre.visitado = false;
                if (ab.nodohijo.Count > 0)
                    ab.nodohijo[0].visitado = false;

                if (ab.nodopadre != null && ab.nodopadre.valor > datonuevo)//Cambia hijo con padre
                {
                    ab.nodohermano = ab.nodopadre.nodohermano;
                    ab.nodopadre.nodohermano = null;
                    ab.nodopadre.nodopadre = ab;
                    ab.nodohijo.Add(ab.nodopadre);
                    ab.nodopadre = null;
                }

                ab.Dibujar(g, ab);
            }
            else
            {
                foreach (BinomialTree ahijo in ab.nodohijo)
                {
                    DisminuirClave(valornodo, datonuevo, g, ahijo);
                }
            }
        }
        public void Dibujar(Graphics g, BinomialTree BT)
        {
            Pen pen = new Pen(SystemColors.ControlDark, 5);
            if (BT.nodopadre != null)//Si tiene padre, se dibuja linea hacia el padre
            {
                DibujarLineas(g, BT.nodopadre.xcentro, BT.nodopadre.ycentro, BT.xcentro, BT.ycentro);
            }
            if (BT.nodohermano != null)//Si tiene hermano, se dibuja linea entre ellos
            {
                DibujarLineas(g, BT.nodohermano.xcentro, BT.nodohermano.ycentro, BT.xcentro, BT.ycentro);
            }
            StringFormat sf = new StringFormat();
            sf.LineAlignment = StringAlignment.Center;
            sf.Alignment = StringAlignment.Center;
            if (visitado)
                g.FillEllipse(Brushes.White, BT.rectangulo);
            else
                g.FillEllipse(Brushes.LimeGreen, BT.rectangulo);

            g.DrawString(BT.valor.ToString(), new Font("Times New Roman", 9.0f), Brushes.Black, new Point(BT.xcentro, BT.ycentro), sf);

            foreach (BinomialTree abb in BT.nodohijo)
                abb.Dibujar(g, abb);
            pen.Dispose();
        }
        private void UnirArboles(BinomialTree b1, BinomialTree b2)
        {
            if (isMin)
            {
                if (b1.Valor >= b2.Valor)
                {
                    b1.nodopadre = b2;
                    if (b1.nodohermano == b2)
                    {
                        b1.nodohermano = null;
                    }
                    else
                    {
                        b2.nodohermano = b1.nodohermano;
                        b1.nodohermano = null;
                    }
                    b2.nodohijo.Add(b1);
                    arboles.Remove(b1);
                }
                else
                {
                    b2.nodopadre = b1;
                    if (b2.nodohermano == b1)
                        b2.nodohermano = null;
                    else
                    {
                        b1.nodohermano = b2.nodohermano;
                        b2.nodohermano = null;
                    }
                    b1.nodohijo.Add(b2);
                    arboles.Remove(b2);
                }
            }
            else//es cola maximo
            {
                if (b1.Valor >= b2.Valor)
                {
                    b1.nodopadre = null;
                    b1.nodohermano = b2.nodohermano;
                    b2.nodopadre = b1;
                    b2.nodohermano = null;
                    b1.nodohijo.Add(b2);
                    arboles.Remove(b2);

                }
                else//b2 es el mayor
                {
                    b2.nodopadre = null;
                    b2.nodohermano = b1.nodohermano;
                    b1.nodopadre = b2;
                    b1.nodohermano = null;
                    b2.nodohijo.Add(b1);
                    arboles.Remove(b1);
                }
            }
        }
 public void InsertarArbol(int nodovalor, Graphics g)
 {
     BinomialTree nuevo = new BinomialTree(nodovalor);
     arboles.Add(nuevo);
     ActualizarCola(g);
     nuevo = null;
 }