Supponiamo di aver definito il tipo Tree come una struct che ha un campo intero el che rappresenta l'intero associato al nodo, e due campi puntatori a Tree, left e right che rappresentano rispettivamente il figlio sinistro e il figlio destro. Per realizzare la tua funzione, dapprima scriviamo una funzione ricorsiva che calcola la somma degli elementi di un albero:
codice:
int sum(Tree * tree){
if(tree == NULL)
return 0;
return tree -> el + sum(tree -> left) + sum(tree -> right);
}
La funzione isLeaf ritorna 1 se l'albero è una foglia:
codice:
int isLeaf(Tree * tree){
return (tree -> left == NULL) && (tree -> right == NULL);
}
A questo punto possiamo scrivere la tua funzione isLeft, che ritorna 1 se e solo se l'albero passato come argomento è sinistro; se l'albero è una foglia ritorna 0, se è NULL ritorna 1:
codice:
int isLeft(Tree *tree){
//Sull'albero nullo ritorno 1
if(tree == NULL)
return 1;
//Su una foglia ritorno 0
if(isLeaf(tree))
return 0;
//controllo la proprietà sul sottoalbero sinistro
//se non è una foglia
if(! isLeaf(tree -> left))
if(! isLeft(tree -> left))
return 0;
//controllo la proprietà sul sottoalbero destro
//se non è una foglia
if(! isLeaf(tree -> right))
if(! isLeft(tree -> right))
return 0;
//infine controllo se la somma del sottoalbero
//sinistro è maggiore della somma del sottoalbero destro
if(sum(tree -> left) <= sum(tree -> right))
return 0;
return 1;
}