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; }