HTDP

勢いで書いていたらしく昨日の日記が意味のわからない文章になっている・・・
ちなみにexercises14.2.3も解けたのでメモ

(define a-BT    ;Figure 38 A バイナリーツリー
  (make-node 63 'top 
             (make-node 29 't 
                        (make-node 15 'd 
                                   (make-node 10 'e false false)
                                   (make-node 24 'f false false))false)
             (make-node 89 'g 
                        (make-node 77 'h false false)
                        (make-node 95 'i false
                                   (make-node 99 'j false false)))))

(define (inorder BT) ;14.2.3 左から右の並びでリストをつくる
  (cond
    ((boolean? BT) empty)
    (else
     (append
      (inorder (node-left BT))
      (list (node-ssn BT))
      (inorder (node-right BT))))))

;--------------------------test

(inorder a-BT) eveluates to ; (list 10 15 24 29 63 77 89 95 99)

;---------------------------

(define (search-bst n BST)  ;;14.2.4 できるだけ少ない計算でnを探しnameを表示する
  (cond
    ((boolean? BST) false)
    ((equal? n (node-ssn BST)) (node-name BST))
    (else
     (cond
       ((< n (node-ssn BST)) (search-bst n (node-left BST)))
       ((> n (node-ssn BST)) (search-bst n (node-right BST)))
       (else false)))))
;----------------------------------------以下14.2.5

(define (create-bst-left B N S)  ;create left
  (cond
    ((boolean? B) (make-node N S false false))
    (else
     (cond
       ((< N (node-ssn B)) (make-node (node-ssn B) (node-name B) (create-bst-left (node-left B) N S) false))
       ((> N (node-ssn B)) (make-node (node-ssn B) (node-name B) (node-left B) (create-bst-left (node-right B) N S)))
       (else 'error?)))))

(define (create-bst-right B N S) ;create right
  (cond
    ((boolean? B) (make-node N S false false))
    (else
     (cond
       ((> N (node-ssn B)) (make-node (node-ssn B) (node-name B) false (create-bst-right (node-right B) N S)))
       ((< N (node-ssn B)) (make-node (node-ssn B) (node-name B) (create-bst-right (node-left B) N S) (node-right B)))
       (else 'error?)))))

(define (create-bst B N S)  ;14.2.5
  (cond
    ((boolean? B) (make-node N S false false))
    ((eqv? (node-ssn B) N) 'equal)
    (else
     (cond
       ((< N (node-ssn B))
        (make-node (node-ssn B) (node-name B) (create-bst-left (node-left B) N S) (node-right B)))
       ((> N (node-ssn B))
        (make-node (node-ssn B) (node-name B) (node-left B) (create-bst-right (node-right B) N S)))
       (else 'error?))))) 

解けたときは嬉しい。がもっときれいに書く方法があると思うのでいろいろと試してみようと思った。