#reader(lib "htdp-intermediate-reader.ss" "lang")((modname main) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f () #f))) ; A MaybeTree is one of ; - (make-tree [Number MaybeTree MaybeTree]) (define-struct tree [n left right]) ; - 'end (define sprout (make-tree 0 'end 'end)) (define seedling (make-tree 5 sprout (make-tree 6 'end 'end))) (define sapling (make-tree 10 (make-tree 6 sprout 'end) (make-tree 12 'end 'end))) (define good-tree (make-tree 50 sapling (make-tree 100 'end 'end))) (define broke-tree (make-tree 5 good-tree good-tree)) ; Tree -> Bool ; Determines whether a Tree is a binary search tree. (define (bst? t) (local [; Tree Number -> Bool ; Recursively checks left and right. (define (recurse t) (or (and (symbol? t) (symbol=? t 'end)) (and (acc-right (tree-right t) (tree-n t)) (acc-left (tree-left t) (tree-n t))))) ; Tree Number -> Bool ; Accumulates the current number to check left. (define (acc-left t n) (or (and (symbol? t) (symbol=? t 'end)) (and (< (tree-n t) n) (recurse t)))) ; Tree Number -> Bool ; Accumulates the current number to check right. (define (acc-right t n) (or (and (symbol? t) (symbol=? t 'end)) (and (> (tree-n t) n) (recurse t))))] (recurse t))) (check-expect (bst? sprout) #t) (check-expect (bst? sapling) #t) (check-expect (bst? good-tree) #t) (check-expect (bst? broke-tree) #f)