|
|
1.1 ! root 1: (* redblack.sml *) ! 2: ! 3: functor RedBlack(B : sig type key ! 4: val > : key*key->bool ! 5: end): ! 6: sig type tree ! 7: type key ! 8: val empty : tree ! 9: val insert : key * tree -> tree ! 10: val lookup : key * tree -> key ! 11: exception Notfound of key ! 12: end = ! 13: struct ! 14: open B ! 15: datatype color = RED | BLACK ! 16: datatype tree = empty | tree of key * color * tree * tree ! 17: exception Notfound of key ! 18: ! 19: fun insert (key,t) = ! 20: let fun f empty = tree(key,RED,empty,empty) ! 21: | f (tree(k,BLACK,l,r)) = ! 22: if key>k ! 23: then case f r ! 24: of r as tree(rk,RED, rl as tree(rlk,RED,rll,rlr),rr) => ! 25: (case l ! 26: of tree(lk,RED,ll,lr) => ! 27: tree(k,RED,tree(lk,BLACK,ll,lr), ! 28: tree(rk,BLACK,rl,rr)) ! 29: | _ => tree(rlk,BLACK,tree(k,RED,l,rll), ! 30: tree(rk,RED,rlr,rr))) ! 31: | r as tree(rk,RED,rl, rr as tree(rrk,RED,rrl,rrr)) => ! 32: (case l ! 33: of tree(lk,RED,ll,lr) => ! 34: tree(k,RED,tree(lk,BLACK,ll,lr), ! 35: tree(rk,BLACK,rl,rr)) ! 36: | _ => tree(rk,BLACK,tree(k,RED,l,rl),rr)) ! 37: | r => tree(k,BLACK,l,r) ! 38: else if k>key ! 39: then case f l ! 40: of l as tree(lk,RED,ll, lr as tree(lrk,RED,lrl,lrr)) => ! 41: (case r ! 42: of tree(rk,RED,rl,rr) => ! 43: tree(k,RED,tree(lk,BLACK,ll,lr), ! 44: tree(rk,BLACK,rl,rr)) ! 45: | _ => tree(lrk,BLACK,tree(lk,RED,ll,lrl), ! 46: tree(k,RED,lrr,r))) ! 47: | l as tree(lk,RED, ll as tree(llk,RED,lll,llr), lr) => ! 48: (case r ! 49: of tree(rk,RED,rl,rr) => ! 50: tree(k,RED,tree(lk,BLACK,ll,lr), ! 51: tree(rk,BLACK,rl,rr)) ! 52: | _ => tree(lk,BLACK,ll,tree(k,RED,lr,r))) ! 53: | l => tree(k,BLACK,l,r) ! 54: else tree(key,BLACK,l,r) ! 55: | f (tree(k,RED,l,r)) = ! 56: if key>k then tree(k,RED,l, f r) ! 57: else if k>key then tree(k,RED, f l, r) ! 58: else tree(key,RED,l,r) ! 59: in case f t ! 60: of tree(k,RED, l as tree(_,RED,_,_), r) => tree(k,BLACK,l,r) ! 61: | tree(k,RED, l, r as tree(_,RED,_,_)) => tree(k,BLACK,l,r) ! 62: | t => t ! 63: end ! 64: ! 65: fun lookup (key,t) = ! 66: let fun look empty = raise (Notfound key) ! 67: | look (tree(k,_,l,r)) = ! 68: if k>key then look l ! 69: else if key>k then look r ! 70: else k ! 71: in look t ! 72: end ! 73: ! 74: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.