Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: carlos9127 en 29 de Octubre 2014, 22:03
-
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.
-
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
-
LISTO AMIGO DISCULPA, JURABA QUE HABÍA RESPONDIDO, AGRADECERÍA TU AYUDA EN ÉSTE EJERCICIO :)
-
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
-
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! ;)
-
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í
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
-
De esta forma voy bien?
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;
}
-
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
-
Entiendo amigo, tendré en cuenta tus consejos