#lang racket
;; Define a binary tree structure
(define-struct node (data left right))
;; A Binary Tree of X (BTOFX) is:
;; - #false (empty tree)
;; - (make-node X BTOFX BTOFX)
(define LEAF #false) ;; Represents an empty tree
;; =====================================
;; Problem 1 - bt/map
;; =====================================
;; bt/map : (X -> Y) BTOFX -> BTOFY
;; Applies a function f to every node's data in the tree
;; Produces a new tree with transformed values
(define (bt/map f tree)
(if (false? tree)
LEAF ;; If the tree is empty, return an empty tree
(make-node (f (node-data tree)) ;; Apply f to current node data
(bt/map f (node-left tree)) ;; Recursive call on left subtree
(bt/map f (node-right tree))))) ;; Recursive call on right subtree
;; =====================================
;; Problem 2 - bt/fold
;; =====================================
;; bt/fold : (X Y Y -> Y) Y BTOFX -> Y
;; Reduces a tree using a combining function and a base case
(define (bt/fold combine base tree)
(if (false? tree)
base ;; If tree is empty, return base case value
(combine (node-data tree)
(bt/fold combine base (node-left tree))
(bt/fold combine base (node-right tree)))))
;; =====================================
;; Example Binary Tree
;; =====================================
;; Constructing the following tree:
;; 1
;; / \
;; 2 3
;; / \ / \
;; 4 5 6 7
(define tree
(make-node 1
(make-node 2
(make-node 4 LEAF LEAF)
(make-node 5 LEAF LEAF))
(make-node 3
(make-node 6 LEAF LEAF)
(make-node 7 LEAF LEAF))))
;; =====================================
;; Testing bt/map
;; =====================================
;; Example: Increment each value in the tree
(define (increment x) (+ x 1))
(define new-tree (bt/map increment tree))
;; Expected structure:
;; 2
;; / \
;; 3 4
;; / \ / \
;; 5 6 7 8
(displayln "Tree with incremented values:")
(display new-tree)
(newline)
;; Example: Doubling each value
(define double-tree (bt/map (lambda (x) (* x 2)) tree))
(displayln "Tree with doubled values:")
(display double-tree)
(newline)
;; =====================================
;; Testing bt/fold
;; =====================================
;; Example: Compute sum of all elements
(define tree-sum (bt/fold (lambda (data left right) (+ data left right)) 0 tree))
(displayln "Sum of all elements:")
(display tree-sum) ;; Expected output: 1+2+3+4+5+6+7 = 28
(newline)
;; Example: Compute maximum value
(define tree-max (bt/fold (lambda (data left right) (max data left right)) -inf.0 tree))
(displayln "Maximum value in tree:")
(display tree-max) ;; Expected output: 7
(newline)
;; Example: Count nodes
(define node-count (bt/fold (lambda (_ left right) (+ 1 left right)) 0 tree))
(displayln "Number of nodes in tree:")
(display node-count) ;; Expected output: 7
(newline)
;; Example: Convert tree to a list (in-order traversal)
(define tree-to-list (bt/fold (lambda (data left right) (append left (list data) right)) '() tree))
(displayln "Tree elements in-order:")
(display tree-to-list) ;; Expected output: (4 2 5 1 6 3 7)
(newline)