我一直在想这个问题,但我自己想不出来给定一个n元树和一个节点,在lisp(我使用的是common lisp,但它的任何版本都可以)中查找到给定节点的路径。n元树如下:(root (subtree1) (subtree2) (subtree3) ...)
,例如(A (B (C) (D)) (E (F) (G)) (H (I) (J)))
表示如下:
A
/ | \
B E H
/\ /\ /\
C D F G I J
给定三个
(A (B (C) (D)) (E (F) (G)) (H (I) (J)))
和节点F
,结果应该是:(A E F)
。附:我用
map
函数寻找了一个解,但我只找到了没有map
函数的递归解。 最佳答案
下面是一个使用mapcan
和递归的人工解决方案:
(defun path (tree leaf)
(cond ((null tree) nil)
((eq (car tree) leaf) (list leaf))
(t (mapcan (lambda (subtree)
(let ((p (path subtree leaf)))
(when p (cons (car tree) p))))
(cdr tree)))))