#-(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