我正在尝试编写一个inorder遍历而不使用append,这是我的代码
(define inorder
(lambda (tree)
(define inorder-iter
(lambda (tree list)
(if (empty-tree? tree)
list
(cons (inorder-iter (left-subtree tree)
(root tree)
(inorder-iter (right-subtree tree) list)))))
(inorder-iter tree '() )))
(define empty-tree? null?)
(define root car)
(define left-subtree cadr)
(define right-subtree caddr)
tree-1
(9
(6 (5 () ()) ())
(18 (11 () (13 () (17 () ()))) (65 (52 (41 (39 () ()) ()) ()) (99 () ()))))
当我打电话时(inorder tree-1) 我得到(((5。6)。9)(11 13 17.18)(((39.41).52).65)99)看起来非常可怕。我想要的是'(5 6 9 11 13 17 18 39 41 52 65 99)。我究竟做错了什么?谢谢!
答案 0 :(得分:2)
您的括号有几个问题。另请注意,您没有使用list
参数 - 更重要的是,它的命名很差,因为它与内置过程冲突。
这个问题要求我们不使用内置的append
函数,但简单的cons
将不起作用。这是一个可能的解决方案:
(define inorder
(lambda (tree)
(define inorder-iter
(lambda (tree lst)
(if (empty-tree? tree)
lst
(inorder-iter (left-subtree tree)
(cons (root tree)
(inorder-iter (right-subtree tree)
lst))))))
(inorder-iter tree '())))
按预期工作:
(inorder tree-1)
=> '(5 6 9 11 13 17 18 39 41 52 65 99)