domingo, 25 de marzo de 2012

Simulador de Arbol ABB en Visual C#

Aqui presento un simulador de Arbol ABB con las siguientes funciones:
  • Recorrido en Amplitud
  • Determinar Máximo y Mínimo
  • Altura del Arbol
  • Profundidad de un Nodo en específico
  • Determinar los nodos hojas
  • Determinar los Nodos Intermedios
  • Insertar Nodo
Aqui pongo el Proyecto para Visual C# y el ejecutable ya funcional en \bin\debug\ . Este código que he desarrollado no es el mas óptimo para este tipo de estructuras, sin embargo a la hora de ejecutar el programa funciona como debería. (Este proyecto no es tan eficiente por la falta de practica en este lenguaje por lo que lo considero mi "Hola Mundo" en Simulación y Estructuras de datos en C#).Recomiendo usarlo para una altura de arbol maxima de 4, porque de ahi en adelante no se aprecia bien el arbol en su totalidad.


Una de las mayores dificultades encontradas al desarrollar esto (ademas del tiempo) fueron lograr el "retraso" deseado para que se pudiera ver la simulación del recorrido que lo solucioné con esto. Y el otro fue lograr dibujar las líneas que unieran los nodos.

En este ultimo punto (en el cual aun no logro descubrir porque no me funcionan las soluciones mas habituales de internet) a lo que recurrí desesperadamente para poder dibujar las lineas fue:
Como use un Panel para dibujar en el los nodos este crea el método private void panel1_Paint(object sender, PaintEventArgs e) en el cual se ejectuta todo lo que este dentro de el cada vez que se "dibuja" en el Formulario; y tambien cree la funcion "pintar" que recibe como parametros un objeto de tipo NodoT y un objeto de tipo PrintEventArgs. Al hacerlo asi me resulto mas facil dibuja


public void pintar(NodoT Raiz, PaintEventArgs e)  {
Pen lapiz = new Pen(Color.Red, 2);
if (Raiz != null){
if (Raiz.NodoIzquierdo != null){
e.Graphics.DrawLine(lapiz, Raiz.t.Location.,Raiz.NodoIzquierdo.t.Location);
pintar(Raiz.NodoIzquierdo, e);
}
if (Raiz.NodoDerecho != null)
{
e.Graphics.DrawLine(lapiz, Raiz.t.Location,Raiz.NodoDerecho.t.Location);
pintar(Raiz.NodoDerecho, e);
}
}
}
Y como no se aun como se usa la clase PrintEventArgs decidí llamar a Pintar dentro de panel1_Paint con el objeto PrintEventArgs de este.
 private void panel1_Paint(object sender, PaintEventArgs e)
{
pintar(Raiz,e);
}

Al hacerlo asi tambien me resultó mas facil dibujar las lineas de forma Recursiva.

Descargar Proyecto.

Fuentes: http://www.algoritmia.net/articles.php?id=17

1 comentario: