Skip to content

Commit 863b4a4

Browse files
committed
Add solution for exercise 3-26
1 parent 3991af7 commit 863b4a4

File tree

2 files changed

+95
-1
lines changed

2 files changed

+95
-1
lines changed

README.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
习题完成情况:
2626
- 章节一: 43/46
2727
- 章节二: 88/97
28-
- 章节三: 25/82
28+
- 章节三: 26/82
2929
- 章节四: TODO
3030
- 章节五: TODO
3131
* 运行

chapter3/exercise3-26.rkt

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#lang racket
2+
(require compatibility/mlist)
3+
4+
(define (make-bst-table [key-compare <] [key-equal equal?])
5+
(let ((root '()))
6+
;; the format of a node, from left to right:
7+
;; key, value, left-tree, right-tree
8+
(define (make-node key value)
9+
(mlist key value '() '()))
10+
11+
(define (node-key node)
12+
(mcar node))
13+
14+
(define (node-value node)
15+
(mcar (mcdr node)))
16+
17+
(define (left-tree node)
18+
(mcar (mcdr (mcdr node))))
19+
20+
(define (right-tree node)
21+
(mcar (mcdr (mcdr (mcdr node)))))
22+
23+
(define (set-left-tree! node left)
24+
(set-mcar! (mcdr (mcdr node)) left))
25+
26+
(define (set-right-tree! node right)
27+
(set-mcar! (mcdr (mcdr (mcdr node))) right))
28+
29+
(define (lookup given-key)
30+
(define (iter node)
31+
(cond ((null? node) #f)
32+
((key-equal given-key (node-key node))
33+
(node-value node))
34+
((key-compare given-key (node-key node))
35+
(iter (left-tree node)))
36+
(else
37+
(iter (right-tree node)))))
38+
(iter root))
39+
40+
(define (insert! key value)
41+
(define (iter node)
42+
(cond ((null? node)
43+
(make-node key value))
44+
((key-equal key (node-key node))
45+
(set-mcar! (mcdr node) value)
46+
node)
47+
((key-compare key (node-key node))
48+
(set-left-tree! node (iter (left-tree node)))
49+
node)
50+
(else
51+
(set-right-tree! node (iter (right-tree node)))
52+
node)))
53+
(set! root (iter root))
54+
'ok)
55+
(define (dispatch m)
56+
(cond ((eq? m 'lookup-proc) lookup)
57+
((eq? m 'insert-proc!) insert!)
58+
(else (error "Unknown operation -- BST-table" m))))
59+
dispatch))
60+
61+
(module+ test
62+
(require rackunit)
63+
(test-case "Test for bst-table of number key"
64+
(define bst-t (make-bst-table))
65+
(define get (bst-t 'lookup-proc))
66+
(define put (bst-t 'insert-proc!))
67+
(check-false (get 10086))
68+
(put 5 "five")
69+
(check-equal? (get 5) "five")
70+
(put 5 "5")
71+
(check-equal? (get 5) "5")
72+
)
73+
(test-case "Test for bst-table of symbol key"
74+
(define bst-t (make-bst-table symbol<? equal?))
75+
(define get (bst-t 'lookup-proc))
76+
(define put (bst-t 'insert-proc!))
77+
(check-false (get 'no-exist-key))
78+
(put 'age 18)
79+
(check-equal? (get 'age) 18)
80+
(put 'age '20)
81+
(check-equal? (get 'age) '20)
82+
)
83+
84+
(test-case "Test for bst-table of string key"
85+
(define bst-t (make-bst-table string<? equal?))
86+
(define get (bst-t 'lookup-proc))
87+
(define put (bst-t 'insert-proc!))
88+
(check-false (get "no-exist-key"))
89+
(put "age" 18)
90+
(check-equal? (get "age") 18)
91+
(put "age" 20)
92+
(check-equal? (get "age") 20)
93+
)
94+
)

0 commit comments

Comments
 (0)