Я пытаюсь вернуть список узлов дерева (не обязательно двоичного дерева), доступ к inorder.tree traversal inorder LISP
Дерево представлено в виде списка с подсписками, например: (a (b) (c (d) (e))), b - левое поддерево, (c (d) (e)) - правое -subtree, a -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' числа всегда ложно. –
Порядок обхода дерева обычно предзаказывается (корень, левый, правый); пост-порядок (левый, правый, корень); и в порядке (слева, справа, справа). Я знаю, что вы опубликовали пример вывода, но что должно означать «в порядке», когда у вас более двух детей? Например, если у вас есть дерево (a (b) (c) (d)), каков должен быть обход в порядке? a b a c a d? –
Еще одна проблема заключается в том, что вы создаете новый список в каждой оценке 'inorder', в то время как вы хотите получить плоский список. Часть о рекурсии 'car/cdr' в [Common Lisp: Gentle Introduction to Symbolic Computation] (http://www.cs.cmu.edu/~dst/LispBook/) может вам помочь. – Pascal