我想创建一个列表,显示二叉树的inorder遍历。 这是我的代码:
(define btree
'(1 (2 (4 (7 #f #f) #f) (5 #f #f)) (3 (6 (8 #f #f) (9 #f #f)) #f)))
(define res '())
(define (inorder tree)
(let loop ([t tree])
(cond (t (loop (cadr t)) (cons (car t) res) (loop (caddr t)))
(else res))))
(inorder btree '())
res
返回的列表是'(),我不知道为什么。 如果我写
(cond (t (loop (cadr t)) (printf "~s " (car t)) (loop (caddr t)))
它打印出正确的结果。 编辑:访问实际上是res。
答案 0 :(得分:1)
你的代码不起作用(什么是visit
?inorder
只需要一个参数),在SO上发布问题时你应该更加小心。此外,您应该包含示例调用和所需的结果。
然而你非常接近。你的主要问题是你使res
成为一个全局变量,而全局变量很少与递归一起使用。此外,可能由于这个原因,未正确管理返回res
。假设第二个实现的结果display
是正确的,这是正确的代码:
(define (inorder tree)
(let loop ((t tree) (res '()))
(if t
(loop (cadr t) (cons (car t) (loop (caddr t) res)))
res)))
如你所见
(loop (caddr t) res)
res
,我们执行(cons (car t) <new-res>)
res
我们(loop (cadr t) <even newer res>)
当然,如果t
为false,我们只需返回res
即可使之前的逻辑正常工作。
我冒昧地使用if
代替cond
,但当然cond
也可以使用。
测试:
> (inorder '(1 (2 (4 (7 #f #f) #f) (5 #f #f)) (3 (6 (8 #f #f) (9 #f #f)) #f)))
'(7 4 2 5 1 8 6 9 3)