2017-05-26 30 views
0

当前正试图围绕着Scheme中二叉树的数据抽象。我正在关注SICP课程,并查看二叉树的实现,但我不确定如何使用它使用元素集?

;; Abstraction barrier 
(define (make-tree entry left right) 
    (list entry left right)) 
(define (entry tree) 
    (car tree)) 
(define (left-branch tree) 
    (cadr tree)) 
(define (right-branch tree) 
    (caddr tree)) 

这本书提出了元素的设置?过程:

(define (element-of-set? x set) 
    (cond ((null? set) #f) 
      ((= x (entry set)) #t) 
      ((< x (entry set)) 
      (element-of-set? x (left-branch set))) 
      ((> x (entry set)) 
      (element-of-set? x (right-branch set))))) 

假设我有一个树节点5,左支1,右分支9,我要着手做的树:

(define my-tree (make-tree 5 1 9)) 

之后,我要检查如果1是集合的成员(我的树):

(element-of-set? 1 my-tree) 

这样做产生以下错误:

mcar: contract violation 
expected: mpair? 
given: 1 

检查1是否为成员的正确语法是什么?

在此先感谢。

回答

2

问题在于你构建树的方式,左右节点都必须是树(在这种情况下为树)。这是建立在树上的正确方法:

(define my-tree (make-tree 5 
          (make-tree 1 '() '()) 
          (make-tree 9 '() '()))) 

现在谓词的工作原理:

(element-of-set? 1 my-tree) 
=> #t