【发布时间】:2010-06-28 05:28:27
【问题描述】:
给定一棵树,我想找到从根到每片叶子的路径。
所以,对于这棵树:
D
/
B
/ \
A E
\
C-F-G
从根 (A) 到叶 (D, E, G) 的路径如下:
(A B D), (A B E), (A C F G)
如果我将上面的树表示为(A (B D E) (C (F G))),那么函数g 就可以了:
(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)))))
但这看起来完全不对。我已经有一段时间不用做这种思考了,但我觉得应该有一种更简洁的方式来做这件事。任何关于更好解决方案的想法(任何语言)都将不胜感激。
编辑 - 将 Svante 的解决方案映射到 Scheme 中给出:
(define (paths tree)
(if (pair? tree)
(append-map (lambda (node)
(map (lambda (path)
(cons (car tree) path))
(paths node)))
(cdr tree))
(list (list tree))))
这比我原来的要整洁得多。
【问题讨论】: