```#-(and) "

P62B (*) Collect the nodes at a given level in a list

A node of a binary tree is at level N if the path from the root to
the node has length N-1. The root node is at level 1. Write a
predicate atlevel/3 to collect all nodes at a given level in a
list.

% atlevel(T,L,S) :- S is the list of nodes of the binary tree T at level L

Using atlevel/3 it is easy to construct a predicate levelorder/2
which creates the level-order sequence of the nodes. However,
there are more efficient ways to do that.
"

;; Simple recursive solution:

;; Notice the above definition use a 1-based index for the level.
;; As always, this is a bad choice, hence the use of (= 1 level) instead of (zerop level).
;; http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF

(defun collect-nodes-at-level (tree level)
(cond
((binary-tree-empty-p tree) '())
((= 1 level)             (list tree))
(t  (append (collect-nodes-at-level (binary-tree-left  tree) (1- level))
(collect-nodes-at-level (binary-tree-right tree) (1- level))))))

;; Note: nconc could be used instead of append, since all the lists
;;       returned by collect-nodes-at-level are newly allocated lists.

;;;; THE END ;;;;```
ViewGit