list of the values in the leaf nodes of binary tree T

Let’s use a DCG – a Definite Clause Grammar. We start with your original definition:

lea(T, L) :-
   phrase(values(T), L).

values(nil) -->
   [].
values(t(X,L,R)) -->
   [X],
   values(L),
   values(R).

Now, we need to restrict ourselves to those t/3 that are leaves. One possibility is to enumerate all cases:

lea2(T, L) :-
   phrase(leaves(T), L).

leaves(nil) -->
   [].
leaves(t(X,nil,nil)) -->
   [X].
leaves(t(_,L,R)) -->
   { dif(L+R,nil+nil) },
   leaves(L),
   leaves(R).

It would be even better and more efficient to use a conditional construct similar to if_/3. I want to leave this to someone interested.

Leave a Comment