This is an assignment. But it was [already] due and I think I worked it out. I'm new to Racket. I feel my code is a bit tedious. Is there any better way to improve it?
The requirement supposes to give a key x, and k is the value of the root node. If x < k, return recursion on left subtree + k + right subtree. If x > k, return recursion on right subtree + k + left subtree. If x=k, (a) return right subtree if left is empty, (b) return left subtree if right is empty, or otherwise (c) return right min value + left subtree + (right subtree - min value):
(define (delete x tree)
(match tree
[(emp) (emp)]
[(node k lt rt)
(cond
[(< x k) (node k (delete x lt) rt)]
[(> x k) (node k lt (delete x rt))]
[else
(cond
[(equal? lt emp) rt]
[(equal? rt emp) lt]
[else
(define (get-min tree)
(match tree
[(emp) (emp)]
[(node k (emp) (emp)) k]
[(node k lt (emp)) (get-min lt)]
[(node k (emp) rt) k]
[(node k lt rt) (get-min lt)]))
(node (get-min rt) lt (delete (get-min rt) rt))])])]))
The following is the given tree structure. We should not modify it.
; The empty tree is represented by an "emp" record of 0 fields.
(struct emp () #:transparent)
; A node is represented by a "node" record of key, left child, right child.
(struct node (key left right) #:transparent)
; BST insert.
(define (insert x tree)
(match tree
[(emp) (node x (emp) (emp))]
[(node k lt rt)
(cond
[(< x k) (node k (insert x lt) rt)]
[(< k x) (node k lt (insert x rt))]
[else tree])]))