我是Lisp的全新手,所以对我很轻松。我试图将二进制搜索树实现为一个数组,并能够按顺序输出它。 我有这个数组,其中索引1是根,2 * i是左子,2 * i + 1是正确的孩子:
#(NIL 30 15 50 10 20 NIL 70 3 NIL 17 NIL NIL NIL NIL 80 NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL)
我发送它到这个函数来提取树的顺序输出:
(defun inOrder (tree rootIndex)
(setq leftI (* rootIndex 2))
(setq rightI (+ leftI 1))
(if (aref tree leftI)
(inOrder tree leftI))
(format t "~D," (aref tree rootIndex))
(if (aref tree rightI)
(inOrder tree rightI)))
预期产量应为3,10,15,17,20,30,50,70,80,但我得到3,10,15,30。 似乎格式之后的代码没有被执行。如果有人能帮助我,我将不胜感激。
答案 0 :(得分:1)
您使用leftI
和rightI
作为绝对变量,因此递归不能按预期工作。相反,使用let*
:
(defun inOrder (tree rootIndex)
(let* ((leftI (* rootIndex 2))
(rightI (+ leftI 1)))
(if (aref tree leftI)
(inOrder tree leftI))
(format t "~D," (aref tree rootIndex))
(if (aref tree rightI)
(inOrder tree rightI))))