显示二进制树的inorder遍历

时间:2016-03-14 14:05:48

标签: scheme racket

我想创建一个列表,显示二叉树的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。

1 个答案:

答案 0 :(得分:1)

你的代码不起作用(什么是visitinorder只需要一个参数),在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)