我正在尝试这个例子page当我试图创建一个后序遍历时看到预订遍历的例子,
(defun bin-tree-postorder (B)
"Create a list containing keys of B in preorder."
(if (bin-tree-leaf-p B)
(list (bin-tree-leaf-element B))
(let ((elmt (bin-tree-node-element B))
(left (bin-tree-node-left B))
(right (bin-tree-node-right B)))
(cons (bin-tree-postorder left)
(cons (bin-tree-postorder right) elmt)))))
我得到了(((2) (3) . +) ((7) (8) . -) . *)
但我渴望'(2 3 + 7 8 - *)。当我尝试使用append
时,它会说" APPEND:正确的列表不得以"结尾错误。如果在其前置罚款附加任何
+, - ,/ etc但最后为什么抱怨?
我需要帮助解决这个问题。
答案 0 :(得分:3)
您没有在此代码中构建您的内容:
(cons (bin-tree-postorder left)
(cons (bin-tree-postorder right)
elmt))
请考虑以下事项:
> (cons 2 (cons 3 '+))
(2 3 . +)
> (cons (list 2) (cons (list 3) '+))
((2) (3) . +)
请查看this answer到Dot notation in scheme,详细了解列表中.
符号的含义,但精简版是Lisps(包括Scheme)中的正确列表之一:
()
;或car
是列表的第一个元素,其cdr
是正确的列表,是列表的其余部分。这意味着要制作列表(2 3 +)
,您需要等效的
(cons 2 (cons 3 (cons '+ '())))
你实际得到的是不同的:
您没有在此代码中构建您的内容:
(cons (bin-tree-postorder left)
(cons (bin-tree-postorder right)
elmt))
left
为2
,(bin-tree-postorder left)
为(2)
right
为3
,(bin-tree-postorder right)
为(3)
elmt
为+
,elmt
为(3)
然后你得到的是
> (cons '(2) (cons '(3) '+))
((2) (3) . '+)
如果您想使用append
,那么您需要将最后一个参数设为正确的列表。 E.g:
(append (bin-tree-postorder left) (bin-tree-postorder right) (list elmt))