[ Foro de C# ]

Dudas de Compilacion de un codigo referente a Arboles Binarios?

21-Feb-2015 08:56
Invitado (Toño)
4 Respuestas

Hola preciados amigos, estoy aprendiendo la programación con C#, solicito de su apoyo para dar solución a lo siguiente, la verdad ya no doy como solucionarlo lo que se pide es:

Solicitar al usuario la captura de valores numéricos de manera repetitiva hasta que el usuario ya no desee continuar con esta operación, así mismo devolver dichos valores capturados en recorrido preorden, entreorden y postorden.

Les muestro el avance de mi código, al depurar el código solo permite la inserción de cinco datos, espero tener el apoyo de alguien que guste disipar las dudas para resolver las modificaciones a dicho código, de antemano muchas gracias por su tiempo y les mando saludos, quedo al pendiente de sus comentarios.

Código:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ArbolBinarioOrdenado1
{
    public class ArbolBinarioOrdenado
    {
        class Nodo
        {
            public int info;
            public Nodo izq, der;
        }
        Nodo raiz;

        public ArbolBinarioOrdenado()
        {
            raiz = null;
        }

        public void Insertar(int info)
        {
            Nodo nuevo;
            nuevo = new Nodo();
            nuevo.info = info;
            nuevo.izq = null;
            nuevo.der = null;
            if (raiz == null)
                raiz = nuevo;
            else
            {
                Nodo anterior = null, reco;
                reco = raiz;
                while (reco != null)
                {
                    anterior = reco;
                    if (info < reco.info)
                        reco = reco.izq;
                    else
                        reco = reco.der;
                }
                if (info < anterior.info)
                    anterior.izq = nuevo;
                else
                    anterior.der = nuevo;
            }
        }


        private void ImprimirPre(Nodo reco)
        {
            if (reco != null)
            {
                Console.Write(reco.info + " ");
                ImprimirPre(reco.izq);
                ImprimirPre(reco.der);
            }
        }

        public void ImprimirPre()
        {
            ImprimirPre(raiz);
            Console.WriteLine();
        }

        private void ImprimirEntre(Nodo reco)
        {
            if (reco != null)
            {
                ImprimirEntre(reco.izq);
                Console.Write(reco.info + " ");
                ImprimirEntre(reco.der);
            }
        }

        public void ImprimirEntre()
        {
            ImprimirEntre(raiz);
            Console.WriteLine();
        }


        private void ImprimirPost(Nodo reco)
        {
            if (reco != null)
            {
                ImprimirPost(reco.izq);
                ImprimirPost(reco.der);
                Console.Write(reco.info + " ");
            }
        }


        public void ImprimirPost()
        {
            ImprimirPost(raiz);
            Console.WriteLine();
        }

        static void Main(string[] args)
        {
            ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado();
            abo.Insertar(100);
            abo.Insertar(50);
            abo.Insertar(25);
            abo.Insertar(75);
            abo.Insertar(150);
            Console.WriteLine("Impresion preorden: ");
            abo.ImprimirPre();
            Console.WriteLine("Impresion entreorden: ");
            abo.ImprimirEntre();
            Console.WriteLine("Impresion postorden: ");
            abo.ImprimirPost();
            Console.ReadKey();
        }
    }
}


Quedo al pendiente de sus comentarios, ojala alguien pueda socorrer a este servidor, saludos.


21-Feb-2015 14:55
Nacho Cabanes (+84)

Claro que ese código te permite añadir más de 5 datos. La lógica parece correcta, y yo le he añadido cuatro datos más y el resultado en orden natural (lo que tú has llamado "EntreOrden") es el correcto.


22-Feb-2015 02:28
Invitado (Kosta)

Muchas gracias por tu aportacion Nacho cabanes, pero no entiendo como insertaste mas datos, podrias decirme como lo realizaste, ya que los 5 datos de los que hablo dentro de la compilacion son estos:

           abo.Insertar(100);
           abo.Insertar(50);
           abo.Insertar(25);
           abo.Insertar(75);
           abo.Insertar(150);

Ahora como realizo lo que se pide: Solicitar al usuario la captura de valores numéricos de manera repetitiva hasta que el usuario ya no desee continuar con esta operación, así mismo devolver dichos valores capturados en recorrido preorden, entreorden y postorden.

Echame la mano porfa te agredecere much, no tengo idea como hacer eso.

Saludos cordiales.


22-Feb-2015 12:05
Nacho Cabanes (+84)

Si añades varias líneas "abo.Insertar(xxx)", insertarás más datos en el árbol.

Si debe ser el usuario quien introduzca los datos, es tan sencillo como hacer


string texto = Console.ReadLine();
if (texto != "") abo.Insertar( Convert.ToInt32(texto) );



Realmente, ese fragmento estaría dentro de un do-while. Pero todo eso es mucho más fácil que el código que ya tienes. Si es que estás empezando y tienes que "parchear" un fuente que no es tuyo, recuerda que en estas páginas tienes un tutorial de C:

http://www.aprendeaprogramar.com/course/view.php?id=31

El apartado 1.9 es que habla de cómo pedir datos al usuario. El 2.2 habla de cómo repetir un trozo de programa mientras se cumple una condición (con "while" en 2.2.1 y "do-while" en 2.2.2).


23-Feb-2015 10:57
Invitado (Kostenio)

Muchas gracias por la info la checare para corregir el codigo y lograr lo que se pide.

Saludos cordiales.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)