Trees exercise #1.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
#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)
|
||||
|
||||
Reference in New Issue
Block a user