This commit is contained in:
2025-09-15 20:40:15 -04:00
parent 46887ff59c
commit ca133f77df
+74
View File
@@ -0,0 +1,74 @@
#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 t -> Bool
; Determines whether a Tree is a binary search tree.
(define (bst? t)
(local [; Tree t -> 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 t, Number n -> 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 t, Number n -> 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)
|#
; A Trie is a [Node]
; A Node is a
; (make-node [String c Boolean e [Node] l])
; and represents a prefix tree. 'c' represents the node character, 'e' is a
; flag for if the node marks the end of a word in the tree, and 'l' is the list
; of child nodes.
(define-struct node [c e l])
(define example-trie
'((make-node "a" #t
((make-node "n" #t ((make-node "d" #t ()) (make-node "t" #t ())))))
(make-node "b" #f
((make-node "e" #t ((make-node "e" #t ())
(make-node "t" #t ((make-node "t" #f ((make-node "e" #f ((make-node "r" #t ())))))))))))
(make-node "c" #f ((make-node "a" #f ((make-node "t" #t ())))))))
; String w, Trie t -> Boolean
; Determines whether the given word is in the given Trie.
(define (in-trie? w t)
(local [; [String])
(check-expect (in-trie? "cat" example-trie) #t)
(check-expect (in-trie? "ca" example-trie) #f)
(check-expect (in-trie? "catch" example-trie) #f)
(check-expect (in-trie? "better" example-trie) #t)
(check-expect (in-trie? "bee" example-trie) #t)
(check-expect (in-trie? "beee" example-trie) #f)