Buenas,quería chequear si esta solución es correcta.Gracias
No, porque vos en el else comparas elemento con elemento, o sea que ninguno es vacio, y te vas a recursion, pensa que entras de vuelta la funcion y asi sigue hasta llegar un caso base, cuando llegas a un caso base es que tiene un valor y como que ahi podes “volver para atras”, pero tu unico caso base devuelve true.
Por ejemplo un arbol con raiz 5, nodos 3 y 8 Si mi lista es 5 solo, entra al else, llama con lsig que ya es null, pero como el arbol NO es null, entra al else, llamas de vuelta con lsig y te da segmentation fault
En el ejemplo,cuando haces la segunda llamada recursiva ,no iría al último else? Porque la l si es NULL, entonces no se cumple (l!=NULL) y llegaría al else de abajo que da false.
Capaz tendría que poner explicito antes del llamado recursivo la posibilidad que me dijiste en vez de poner un else y false.
Pero no entiendo porque no estaría contemplando ese caso. .
Te falta considerar el caso de que la lista terminó pero en un nodo del árbol que no era una hoja.
Fijate el caso donde por ejemplo la lista termina en un nodo del árbol que solo tiene un subarbol derecho pero no izquierdo.
En ese caso, cuando entres a la recursión para la izquierda, se va a cumplir que a y l son NULL, en tu caso eso devuelve true pero deberías devolver false.
Saludos
tendría que agregarlo como primer caso?
gracias
bool esCamino(AB a,Lista l){
if(a==NULL && (l!=NULL) || (a!=NULL && l==NULL) ||( l==NULL && (a->izq!=NULL ||a->der!=NULL)))
return false;
else if(a==NULL && l==NULL)
return true;
else
return (a->elem==l->elem) && (esCamino(a->der,l->sig) || esCamino(a->izq,l->sig));
}
Hola Bruno.
En tu nueva propuesta cuando a y l son NULL el primer if te va a dar error porque en el tercer or estas accediendo a->izq y a->der.
Te sugiero que lo pienses con una función auxiliar de forma de que el caso de que a y l sean NULL al comienzo lo consideres por fuera de la recursión.
Saludos
Yo hice una función parecida, el problema que tenés lo solucioné separando el caso que sería tu else if en 3 subcasos:
Si a->izq != NULL y a->der != NULL, hago eso mismo que hacés vos: return (a->elem==l->elem) && (esCamino(a->der,l->sig) || esCamino(a->izq,l->sig));
Si a->izq == NULL y a->der != NULL devuelvo (a->elem==l->elem) && esCamino(a->der,l->sig) ;
SI a->izq != NULL y a->der == NULL devuelvo (a->elem==l->elem) && esCamino(a->izq,l->sig) ;
De esa manera evito que devuelva true el subarbol vacío.