From b7442c83299868cd0c297eca501db1488853360b Mon Sep 17 00:00:00 2001 From: Jacob Signorovitch Date: Mon, 15 Sep 2025 11:38:35 -0400 Subject: [PATCH] Trees exercise #1. --- trees/main.rkt | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 trees/main.rkt diff --git a/trees/main.rkt b/trees/main.rkt new file mode 100644 index 0000000..92ccb33 --- /dev/null +++ b/trees/main.rkt @@ -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) +