【发布时间】:2015-02-12 15:12:47
【问题描述】:
使用这种表示树木的方式:(A (B) (C (D) (E))) (根据我所见,我认为这是标准方式,但我可能错了)。
A
/ \
B C
/ \
D E
我想找到最大深度并构建一个包含从根到该级别的节点的列表。 对于上面的示例,答案将是 2(根在级别 0),具有以下两个列表之一:(A C D) 或 (A C E)。
maxdepth 算法应该很简单:
maxdepth( tree ):
if ( !tree ) return 0
leftdepth = maxdepth( left sub-tree )
rightdepth = maxdepth( right sub-tree )
return max ( leftdepth + 1, rightdepth + 1 )
所以我尝试了类似的方法:
(defun maxdepth(l)
(cond
((null l) 0)
((atom l) 0)
((+ 1 (max (maxdepth(car l)) (maxdepth(cdr l)))))
)
)
CAR 树应该给我左子树,而 CDR 树应该给我右子树。如果我到达终点或一个原子(这感觉不对),我会停下来。我检查 maxdepth(car l) 是否大于 maxdepth(cdr l) 并使用更大的更进一步。 但这给了我 8 上面的树。而且我还没有开始构建列表。
我离一个好主意和一个好的实施还有多远?
【问题讨论】:
标签: tree lisp common-lisp