Autor Tema: comprobar si existen elementos repetidos en árboles binarios Java  (Leído 13177 veces)

carlos9127

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 19
    • Ver Perfil
Diseñe un programa que dados 2 arboles binarios, permita eliminar de ambos los elementos que se encuentran repetidos. Se deben mostrar los 2 árboles originales y los 2 elementos eliminados.
« Última modificación: 30 de Octubre 2014, 08:39 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2054
    • Ver Perfil
Re:Ayuda con este programa en Java
« Respuesta #1 en: 29 de Octubre 2014, 23:16 »
Hola, creo que no has respondido a este mensaje: www.aprenderaprogramar.com/foros/index.php?topic=1517

¿No te parece que deberías responder algo antes de preguntar sobre otro tema?

Saludos

carlos9127

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 19
    • Ver Perfil
Re:Ayuda con este programa en Java
« Respuesta #2 en: 29 de Octubre 2014, 23:18 »
LISTO AMIGO DISCULPA, JURABA QUE HABÍA RESPONDIDO, AGRADECERÍA TU AYUDA EN ÉSTE EJERCICIO :)

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2054
    • Ver Perfil
Re:Ayuda con este programa en Java
« Respuesta #3 en: 29 de Octubre 2014, 23:31 »
Gracias por responder. Nuestra voluntad es ayudar, pero cuando menos esperamos que se responda, aunque sea para decir que la duda no ha podido ser resuelta, o si se ha podido, cómo. Aquí tratamos de colaborar entre todos, por eso te pido que respondas por lo menos, aquí veo otro mensaje sin responder:

www.aprenderaprogramar.com/foros/index.php?topic=1335

Y aquí otro:

www.aprenderaprogramar.com/foros/index.php?topic=1333

Y aquí otro:

https://www.aprenderaprogramar.com/foros/index.php?topic=1298

Espero que respondas algo a esos mensajes, no simplemente decir gracias, sino tratar de responder algo que ayude a las demás personas que puedan leer los mensajes, por ejemplo cómo solucionaste el problema, el código solución, lo que sea...

Me parece justo pedir un poco de colaboración a quien pide que colaboren con él, al menos ese es el espíritu con el que trabajamos los moderadores en estos foros.

Saludos

carlos9127

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 19
    • Ver Perfil
Re:Ayuda con este programa en Java
« Respuesta #4 en: 30 de Octubre 2014, 05:05 »
Si amigo tienes toda la razon pero no es que no quiera agradecer, lo que sucede es que a veces olvido que pregunto, no reviso constantemente el correo o a veces por mi trabajo no puedo, pero tratare de estar mas pendiente y reconocerles la gran ayuda que nos brindan a personas como yo, gracias! ;)

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2054
    • Ver Perfil
Re:comprobar si existen elementos repetidos en árboles binarios Java
« Respuesta #5 en: 30 de Octubre 2014, 08:40 »
Hola, para ver un ejemplo de árbol binario puedes guiarte por este ejemplo: https://www.aprenderaprogramar.com/foros/index.php?topic=1367.msg7474#msg7474


Para operar con este tipo de árboles necesitas usar y comprender el concepto de recursividad: www.aprenderaprogramar.com/foros/index.php?topic=1493


Tienes que definir un método para "eliminar elementos repetidos" pero te recomiendo que antes de programarlo directamente hagas pasos preliminares para ir más seguro.

Te aconsejo que empieces por crear un método que permita comparar un árbol con otro árbol y que muestre por pantalla cuáles son los elementos repetidos.

Tienes que pensar cómo hacerlo. En esto influiría bastante si se tratara de árboles ordenados o no, pero para resolverlo para el caso más general voy a suponer que se trata de árboles no ordenados.

Habría que pensar cómo hacerlo. Se me están ocurriendo dos opciones.

El método supongamos que tiene la signatura siguiente:

public void detectarElementosDuplicados (Arbol elArbolQueQueremosComparar) {

}


Podríamos plantearlo de varias maneras:

a) Recorrer el árbol que representa la clase y meter los valores que almacenan sus nodos en un array (array1). Luego recorrer el árbol que se recibe por parámetro y meter los valores que almacenan sus nodos en un array (array2). Luego comparar ambos arrays para ver cuáles son los valores duplicados, que podemos meter en otro array de elementosDuplicados. Finalmente, recorrer el árbol original y cuando se compruebe que el valor en un nodo coincide con un valor en elementosDuplicados, mostrar el mensaje por pantalla.

Nota: la comparación de dos arrays para encontrar valores duplicados la haríamos así

Código: [Seleccionar]
int k=0;
for(int i = 0; i < array1.length; i++)
{
    for(int j = 0; j < array2.length; j++)
    {
        if(array1[i] == array2[j])
        {
            elementosDuplicados[k]= array1[i]; //AÑADIR el elemento al array de duplicados
    k=k+1;
        }
    }
}

Con esto habría que recorrer dos árboles, y luego comparar sus valores


b) Quizás resulte más interesante hacerlo de otra manera como esta: recorremos los valores contenidos en el árbol que recibimos por parámetro y los almacenamos en un array denominado array2.

Ahora comienzas el recorrido del árbol y para cada valor en ese árbol compruebas si existe en el array2. En caso de que exista, muestras un mensaje por pantalla, y en caso de que no exista, continúas el recorrido.


Intenta plantearlo y pega el código que vayas creando para tratar de ayudarte.

Saludos

carlos9127

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 19
    • Ver Perfil
Re:comprobar si existen elementos repetidos en árboles binarios Java
« Respuesta #6 en: 31 de Octubre 2014, 03:27 »
De esta forma voy bien?


Código: [Seleccionar]
public class ArbolBinario {
class Nodo
{

   private int dato;
    private Nodo izq, der;

    public Nodo(int dato, Nodo izq, Nodo der) {
        this.dato = dato;
        this.izq = izq;
        this.der = der;
    }

    public int getDato() {
        return dato;
    }

    public void setDato(int dato) {
        this.dato = dato;
    }

    public Nodo getIzq() {
        return izq;
    }

    public void setIzq(Nodo izq) {
        this.izq = izq;
    }

    public Nodo getDer() {
        return der;
    }

    public void setDer(Nodo der) {
        this.der = der;
    }

}

public ArbolBinario(){
    raiz = null;
}
public void insertar(int info){
    Nodo 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;
    }
   
}


//Para insertar nodo
public void insertardatos()
{
    int cant;
    int num;
    System.out.print("Ingresar cantidad de nodos");
    cant=Leer.datoInt();
    for(int i=0;i<cant;i++)
    {
       System.out.print("ingrese nodo"+(i+1)+" :");
       num = Leer.datoInt();
       insertar(num);
    }
}

//Para buscar Nodo
public String buscar(int num)
{
    if(buscar(this.raiz,num)==true) return "Se encontro el numero"+num +"en el arbol";
    else return "No se encontro el numero" +num +"en el arbol";
}
private boolean buscar(Nodo n, int num)
{
    if(n!=null)
    {
        if(n.info==num) return true;
        boolean bus1 = buscar(n.Izq, num);
        boolean bus2 = buscar(n.Der,num);
        if((bus1 == true)||(bus2 == true))return true;
    }
    return false;
}

 

//contar los nodos
public int contar()
{

    int cant =contar(this.raiz);
    return cant;
}

private int contar(Nodo n)
{

    if (n==null) return 0;
    int c1=contar(n.izq);
    int c2=contar(n.der);
    int c3 = c1 + c2 + 1;

    return c3;
}

//metodo para eliminar
public void borrar ( int elemento)
{

    raiz = borrar(this.raiz, elemento);
}
private Nodo borrar(Nodo r, int elemento){
    if(r.info==elemento)
     {

            if(r.der == null && r.izq == null)
            {
                r = r.izq;
                return r;
            }
            if(r.der == null)
            {
         
               r = r.izq;
               return r;
             }
             
             if(r.izq == null){
                r = r.der;
                return r;
              }

// caso en el que el nodo tiene dos hijos
r.info = encontrarMaximo(r.izq);
r = ajuste(r, r.izq, r);
 
}

if(elemento>r.info)
{
   r.der = borrar(r.der, elemento);
   return r;
}

r.izq = borrar(r.izq, elemento);
return r;

}


Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2054
    • Ver Perfil
Re:comprobar si existen elementos repetidos en árboles binarios Java
« Respuesta #7 en: 31 de Octubre 2014, 09:47 »
Hola, no lo veo bien porque:

a) El código no compila. Tienes que ir construyendo código poco a poco y a cada paso ir comprobando si compila o no.

b) No veo un motivo que justifique el tener la clase Nodo dentro de la clase ArbolBinario, lo más normal es que cada clase esté separada, así el código resultará más fácil de entender y depurar. Así es como está en los ejemplos que te indicaba antes. No obstante, una clase puede estar dentro de otra si existe un motivo justificado  ::)

Saludos

carlos9127

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 19
    • Ver Perfil
Re:comprobar si existen elementos repetidos en árboles binarios Java
« Respuesta #8 en: 02 de Diciembre 2014, 04:39 »
Entiendo amigo, tendré en cuenta tus consejos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".