【发布时间】:2016-03-14 00:49:37
【问题描述】:
我正在尝试返回按顺序访问的树(不一定是二叉树)的节点列表。
树表示为带有子列表的列表,例如:(a (b) (c (d) (e))), b - left-subtree, (c (d) (e)) - right-子树,一个-root。 结果应该是:b,a,d,c,e
这是我的代码,但我似乎总是收到“堆栈溢出”错误。有人可以帮帮我吗?
;return left-subtree
(defun left-tree(tree)
(cond
((null tree) NIL)
((not (listp tree)) NIL)
(t (car (cdr tree)))
)
)
;return right-tree
(defun right-tree(tree)
(cond
((null tree) NIL)
((not (listp tree)) NIL)
(t (cdr (cdr tree)))
)
)
;perform inorder
(defun inorder(tree)
(if (not (list-length tree)) 0
(append
(inorder (left-tree tree))
(list (car tree))
(inorder (right-tree tree))
)
)
)
【问题讨论】:
-
(not (list-length tree))的目的是什么?一个数字的not总是假的。 -
树遍历的顺序通常是前序的(根、左、右);后序(左、右、根);并按顺序(左,根,右)。我知道您发布了一个输出示例,但是当您有两个以上的孩子时,“按顺序”应该是什么意思?例如,如果你有树 (a (b) (c) (d)),那么有序遍历应该是什么? a b a c a d?
-
另一个问题是,您在每次评估
inorder时都会创建一个新列表,而您希望最终得到一个平面列表。 Common Lisp: A Gentle Introduction to Symbolic Computation 中关于car/cdr recursion的部分可能会对您有所帮助。 -
请正确格式化您的代码(缩进和括号放置)。因为它不是,所以很难读。
标签: tree lisp common-lisp inorder