Я не думаю, что это правильно. Проблема, которую я вижу, заключается в первом шаге:
if((l(x)!=null && r(x)!=null) || (l(x)==null && r(x)==null))
return "yes"
else return "no"
Проблема в том, что вы не можете определить «да» для целого дерева на первом шаге. Что вам нужно сделать, это разбить его на компоненты:
if this node has both children
return the result of test(l,r,l(x)) && (test(l,r,r(x))
if this node has no children
return true
if this node has 1 child
return false
в соответствии с вашим последним вопросом («Если l и r являются функциями, почему они передаются как нормальные параметры при вызове функции?»), Ответ таков: они не имеют для передается в качестве параметров. Это просто обозначение, которое они выбрали, когда сказали: «Бинарное дерево может быть закодировано с использованием двух функций l и r [...]»