elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda para comparar 2 arboles binarios
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda para comparar 2 arboles binarios  (Leído 13,853 veces)
clupin

Desconectado Desconectado

Mensajes: 9


Ver Perfil
ayuda para comparar 2 arboles binarios
« en: 29 Diciembre 2013, 13:35 pm »

Hola, estoy con problemas para comparar 2 arboles binarios, al intentar compararlos, deberia devolverme 0 si son iguales, 1 si son distintos, pero el programa solo me devuelve el lado de la derecha y no compara la izq, espero puedan ayudarme

Código
  1. int iguales(arbol *a, arbol *b){
  2.        if(a == NULL && b ==NULL){
  3. return 0;
  4. } else {
  5. if(a == NULL || b == NULL){
  6. return 1;
  7. } else {
  8. if(a->dato == b->dato){
  9. iguales(a->izq, b->izq);
  10. iguales(a->der, b->der);
  11. } else {
  12. return 1;
  13. }
  14. }
  15. }
  16. }
  17.  


« Última modificación: 29 Diciembre 2013, 13:43 pm por clupin » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ayuda para comparar 2 arboles binarios
« Respuesta #1 en: 29 Diciembre 2013, 17:24 pm »

Cuando tengas una duda o problema con alguno de tus programas por favor indica el lenguaje de programación. En el caso de C ...

deberia devolverme 0 si son iguales, 1 si son distintos
Lo usual es devolver verdadero (un valor distinto de cero, usualmente uno) si se cumple la condición y falso (cero) en caso contrario.

el programa solo me devuelve el lado de la derecha y no compara la izq
Eso sucede porque falta retornar el valor en el caso de que ambos nodos sean diferentes de NULL y con igual valor:
Código
  1. if (a->dato == b->dato){ /* <== No hay valor de retorno en esta rama de ejecucion */
  2.   iguales(a->izq, b->izq);
  3.   iguales(a->der, b->der);
  4. } else {
  5.   return 1;
  6. }

Por ultimo se pueden ahorrar algunas comparaciones. Por ejemplo (retornando verdadero si son iguales):
Código
  1. struct nodo {
  2.   int valor;
  3.  
  4.   struct nodo *izq;
  5.   struct nodo *der;
  6. };
  7.  
  8. /* ... */
  9.  
  10. int equ(struct nodo *p, struct nodo *q)
  11. {
  12.   if (p != NULL && q != NULL && p->valor == q->valor)
  13.      return equ(p->izq, q->izq) && equ(p->der, q->der);
  14.   else
  15.      return p == q;
  16. }

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
clupin

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: ayuda para comparar 2 arboles binarios
« Respuesta #2 en: 29 Diciembre 2013, 17:34 pm »

Muchas Gracias (por todas las las aclaraciones) :)
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: ayuda para comparar 2 arboles binarios
« Respuesta #3 en: 29 Diciembre 2013, 18:32 pm »

Citar
iguales(a->izq, b->izq);
iguales(a->der, b->der);

Los valores de retorno de cada "iguales" no se guardan en ningún lugar.

Código
  1. if(!iguales(...) && !iguales(...)) ...
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: ayuda para comparar 2 arboles binarios
« Respuesta #4 en: 30 Diciembre 2013, 10:37 am »

¡Buenas!

Si por iguales te refieres a que tienen la misma estructura y los mismos datos en los mismos nodos solo te falta comprobar, como ya te han dicho, si las comparaciones en las distintas ramas te devuelven 0 o 1, y si alguna devuelve 1 ya no tienes que seguir comparando, solo tienes que devolver este valor.

En cambio, si por iguales entendemos que aunque la estructura es distinta tienen los mismos datos, tu código no es correcto. Imagina el nodo raíz con valores distintos, de dos árboles con los mismos datos pero con distinta estructura. Cuando llegues a
Código
  1.    if (a->dato == b->dato){ /* <== No hay valor de retorno en esta rama de ejecucion */
  2.      iguales(a->izq, b->izq);
  3.      iguales(a->der, b->der);
  4.    } else {
  5.      return 1;
  6.    }
  7.  
a->dato != b->dato, ya que aunque los valores almacenados son los mismos, los valores de los nodos raíz son distintos. Por lo tanto la función devolverá 1 a pesar de que debería devolver 0.

Tampoco puedes asegurar que los nodos hoja sean los mismos, ya que has podido introducir los datos en distinto orden y por lo tanto ocuparán posiciones distintas dentro del árbol.

Lo que tienes que hacer es un recorrido inorden de cada uno de los dos árboles e ir comparando los valores de los nodos.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda en arboles binarios
Programación C/C++
josue_tux 1 3,011 Último mensaje 25 Junio 2011, 14:10 pm
por satu
ayuda urgente en arboles binarios
Programación C/C++
josue_tux 1 4,105 Último mensaje 10 Julio 2011, 16:04 pm
por Triper0
[C] Funciones para arboles binarios
Programación C/C++
gasparenaide 0 2,145 Último mensaje 19 Marzo 2013, 01:47 am
por gasparenaide
Ayuda con arboles binarios en c++
Programación C/C++
cyntiao. 1 3,529 Último mensaje 22 Julio 2013, 22:25 pm
por eferion
Ayuda para visualizar garfos y arboles
Programación C/C++
tai96 3 3,071 Último mensaje 15 Junio 2016, 02:33 am
por AlbertoBSD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines