Devo implementare un programma C che prenda in input un albero binario di caratteri e un carattere. Se tale carattere è una foglia il programma deve creare dinamicamente un stringa che contenga i caratteri che formano il percorso radice-carattere.
Esempio:
f
/ \
a v
/ \ \
s b r
invocando il metodo cammino(T,'b') deve restituire un stringa del tipo: "fab/0"
mentre se gli do: cammino(T,'v') deve restituire NULL
Ho scritto il seguente codice, ma ahimè mi imbatto nel maledetto segmentation fault
#include "libreria.h"
int esiste_foglia(albero T,char f) {
if (T==NULL)
return 0;
else
if((T->info==f)&&(T->left==NULL)&&(T->right==NULL))
return 1;
else return esiste_foglia(T->left,f)|| esiste_foglia(T->right,f);
}
int is_leaf(albero T,char c) {
if (T==NULL)
return 0;
else if(T->left==NULL&&T->right==NULL&&T->info==c)
return 1;
return is_leaf(T->left,c) || is_leaf(T->right,c);
}
int profondita_foglia(albero T, char c) {
if (T==NULL || !is_leaf(T,c) || T->info==c)
return 0;
else
if(is_leaf(T->left,c))
return 1+profondita_foglia(T->left,c);
else
if(is_leaf(T->right,c))
return 1+profondita_foglia(T->right,c);
}
char* cammino(albero T,char c){
int i;
char* stringa=NULL;
int p;
if(T==NULL || !is_leaf(T,c))
return 0;
else
p=profondita_foglia(T,c);
stringa=calloc(p+2,sizeof(char));
i=0;
cammino_aux(T,stringa,c,&i);
return stringa;
}
void cammino_aux(albero T,char* s,char c,int* i) {
if(T->info==c) {
s[*i]=c;
*i=*i+1;
s[*i]='\0';
}
else
if (is_leaf(T->left,c)){
s[*i]=T->info;
*i=*i+1;
cammino_aux(T->left,s,c,*i);
}
else {
if (is_leaf(T->right,c)){
s[*i]=T->info;
*i=*i+1;
cammino_aux(T->right,s,c,*i);
}
}
}