Given the tree, I want to find paths from the root to each leaf.
So for this tree:
D
/
B
/ \
A E
\
C-F-G
has the following paths from root (A) to leaves (D, E, G):
(A B D), (A B E), (A C F G)
If I present the tree above as (A (B D E) (C (F G))), then the function gdoes the trick:
(define (paths tree)
(cond ((empty? tree)
'())
((pair? tree)
(map (lambda (path)
(if (pair? path)
(cons (car tree) path)
(cons (car tree) (list path))))
(map2 paths (cdr tree))))
(else
(list tree))))
(define (map2 fn lst)
(if (empty? lst)
'()
(append (fn (car lst))
(map2 fn (cdr lst)))))
But everything looks wrong. I didn’t have to think about it for a while, but I feel that there should be a more accurate way to do this. Any ideas for a better solution (in any language) will be appreciated.
EDIT - Mapping a Svante solution to Scheme gives:
(define (paths tree)
(if (pair? tree)
(append-map (lambda (node)
(map (lambda (path)
(cons (car tree) path))
(paths node)))
(cdr tree))
(list (list tree))))
which is far ahead of my original.
source
share