Ваша ошибка в том, что вы не должны использовать while, а вместо if, потому что это рекурсивно, но что вы хотите, чтобы функция возвращала? данные последнего члена? если так, то так и должно быть:
int secondlargest(struct node* a) {
if(a == NULL) return -1;
secondlargestr(a);
}
int secondlargestr(struct node* a) {
if(a->right!=NULL) return secondlargest(a->right);
return (a->data);
}