; lowest common ancestor
(define (tree k l r) (vector k l r))
(define (key t) (vector-ref t 0))
(define (lkid t) (vector-ref t 1))
(define (rkid t) (vector-ref t 2))
(define nil (vector 'nil 'nil 'nil))
(define (nil? t) (eq? t nil))
(define (lookup lt? t k)
(cond ((nil? t) #f)
((lt? k (key t)) (lookup lt? (lkid t) k))
((lt? (key t) k) (lookup lt? (rkid t) k))
(else #t)))
(define (insert lt? t k)
(cond ((nil? t) (tree k nil nil))
((lt? k (key t)) (tree (key t) (insert lt? (lkid t) k) (rkid t)))
((lt? (key t) k) (tree (key t) (lkid t) (insert lt? (rkid t) k)))
(else (tree k (lkid t) (rkid t)))))
(define (lca lt? t lo hi)
(cond ((and (not (lt? (key t) lo))
(not (lt? hi (key t)))) (key t))
((lt? (key t) lo) (lca lt? (rkid t) lo hi))
(else (lca lt? (lkid t) lo hi))))
(define t nil)
(set! t (insert < t 8))
(set! t (insert < t 3))
(set! t (insert < t 10))
(set! t (insert < t 1))
(set! t (insert < t 6))
(set! t (insert < t 14))
(set! t (insert < t 4))
(set! t (insert < t 7))
(set! t (insert < t 13))
(display (lca < t 4 7)) (newline) ; 6
(display (lca < t 4 10)) (newline) ; 8
(display (lca < t 1 4)) (newline) ; 3
(display (lca < t 1 3)) (newline) ; 3
(display (lca < t 3 6)) (newline) ; 3