2017-05-26 67 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