PasteRack.org
Paste # 12757
2025-03-06 01:13:21

Fork as a new paste.

Paste viewed 479 times.


Embed:

black-check

  1. #lang typed/racket
  2.  
  3. (require typed/rackunit)
  4.  
  5. (define-type Color (U 'red 'black))
  6. (define-type RBTree (U Node 'mt))
  7. (struct Node ([color : Color] [l : RBTree] [r : RBTree]) #:transparent)
  8.  
  9. (define nat? natural?)
  10.  
  11. ;; given an RBTree, return true if the number of black nodes along every path is the same
  12. (define (blackcheck [t : RBTree])
  13.   (and (bc/helper t) #t))
  14.  
  15. ;; given an RBTree where the number of black nodes is the long along every path to an 'mt, return
  16. ;; the number of black nodes along those paths. Otherwise, return false
  17. (define (bc/helper [t : RBTree]) : (U False Natural)
  18.   (match t
  19.     ['mt 0]
  20.     [(Node color l r)
  21.      (define l-result (bc/helper l))
  22.      (define r-result (bc/helper r))
  23.      (match* (l-result r-result)
  24.        [((? nat? l#) (? nat? r#))
  25.         (cond [(= l# r#)
  26.                (+ (oneifblack color) l#)]
  27.               [else #f])]
  28.        [(_ _) #f])]))
  29.  
  30. ;; return 1 if the color is black, 0 if it's red
  31. (define (oneifblack [c : Color])
  32.   (match c
  33.     ['red 0]
  34.     ['black 1]))
  35.  
  36. (check-equal? (blackcheck 'mt) #t)
  37. (check-equal? (blackcheck (Node 'black (Node 'black 'mt 'mt) 'mt)) #f)
  38. (check-equal? (blackcheck (Node 'black (Node 'black 'mt 'mt) (Node 'black 'mt 'mt))) #t)
  39. (check-equal? (blackcheck (Node 'black (Node 'red (Node 'black 'mt 'mt) (Node 'black 'mt 'mt))
  40.                                 (Node 'black 'mt 'mt))) #t)
  41. (check-equal? (blackcheck (Node 'black (Node 'red (Node 'black 'mt 'mt) 'mt)
  42.                                 (Node 'black 'mt 'mt))) #f)

=>