fork download
  1. #lang racket
  2.  
  3. (define (list->bst lst (cmp <) #:key (fn identity))
  4. (define (loop lst cmp fn)
  5. (if (null? lst)
  6. '()
  7. (let ((pivot (car (drop lst (quotient (length lst) 2)))))
  8. (let ((left (loop (filter (lambda (x)
  9. (cmp (fn x) (fn pivot)))
  10. lst) cmp fn))
  11. (right (loop (filter (lambda (x)
  12. (cmp (fn pivot) (fn x)))
  13. lst) cmp fn)))
  14. (cond ((list? pivot) `(,@pivot ,left ,right))
  15. ((pair? pivot) (match-let (((cons k v) pivot))
  16. `(,k ,v ,left ,right)))
  17. (else `(,pivot ,left ,right)))))))
  18. (loop (sort lst cmp #:key fn) cmp fn))
  19.  
  20. (define (bst-search v tree (cmp equal?) #:keyfn (kfn <) #:key (fn car))
  21. (match tree
  22. ('() #f)
  23. (`(,lvp ... ,left ,right)
  24. (cond ((cmp v (fn lvp)) lvp)
  25. ((kfn v (fn lvp)) (bst-search v left cmp #:keyfn kfn #:key fn))
  26. (else (bst-search v right cmp #:keyfn kfn #:key fn))))))
Success #stdin #stdout 0.67s 93956KB
stdin
Standard input is empty
stdout
Standard output is empty