Deletion from Okasaki’s Red-Black Trees: A Functional Pearl
Matt Might University of Utah matt.might.net @mattmight
Deletion from Okasakis Red-Black Trees: A Functional Pearl Matt - - PowerPoint PPT Presentation
Deletion from Okasakis Red-Black Trees: A Functional Pearl Matt Might University of Utah matt.might.net @mattmight Red-black delete? RTFM exercise to the reader 8 5 9 2 6 11 8 5 9 2 6 11 8 6 9 2 11 8 6 9 2 11 8 6
Deletion from Okasaki’s Red-Black Trees: A Functional Pearl
Matt Might University of Utah matt.might.net @mattmight
Red-black delete?
8 5 9 6 2 11
8 5 9 6 2 11
8 9 6 2 11
8 9 6 2 11
8 9 6 2 11
functional red black delete
Racket
Racket
(Kahrs, 2001)
(“Untyped” Kahrs)
(“Untyped” Kahrs / Scala)
(“Untyped” Kahrs / OCaml)
(Reppy, SML/NJ)
(Kahrs, 2001)
BST delete + balance' = red-black delete?
1 2 3
1 2 3
Problem: Paths to leaves must have same number of blacks.
2 1 3
2 1 3
Problem: Reds cannot have red children.
2 1 3
2 1 3
2 1 3
y
y
y z x
a d
z x y
a d
y z x
a d
z x y
a d
z x y
a d
z x y z y x x z y x y z
a b c d a b c d b c a d a b c d
z x y z y x x z y x y z
a b c d a b c d b c a d a b c d
a b c d
y x z
a a a b b b c c d d
a b c d
y x z
a a a b b b c c d d
a b c d
y x z
(define (balance-node node) (match node [(or (B (R (R a x b) y c) z d) (B (R a x (R b y c)) z d) (B a x (R (R b y c) z d)) (B a x (R b y (R c z d)))) ; => (R (B a x b) y (B c z d))] [else node]))
Black Red
Double black Black Red
Double black Black Red Negative black
Double black Black Red Negative black
Double black Black Red Negative black
b+Black
1
2 1
+Black
+Black
x
x
x y
y
x y
y
x y
x y
y z y z y z y x y x y x
y x z y x z y x z y x z y x z y x z
y x z
+Black
y x z y x z y x z y x z y x z
“Bubbling”
y x z y x z y x z y x z y x z y x z
y x z y x z y x z y x z y x z y x z
y x z y x z y x z y x z y x z y x z
y x z y x z y x z y x z
y z y x
y z y x
y z y x
z x y z y x x z y x y z
a b c d a b c d b c a d a b c d
y x z
a b c d
y x z y x z y x z
a b c d a b c d a b c d
(define (balance-node node) (match node [(or (B/BB (R (R a x b) y c) z d) (B/BB (R a x (R b y c)) z d) (B/BB a x (R (R b y c) z d)) (B/BB a x (R b y (R c z d)))) ; => (R (black+1 node) (B a x b) y (B c z d))] [else node]))
(define (balance-node node) (match node [(or (B/BB (R (R a x b) y c) z d) (B/BB (R a x (R b y c)) z d) (B/BB a x (R (R b y c) z d)) (B/BB a x (R b y (R c z d)))) ; => (T (black-1 node) (B a x b) y (B c z d))] [else node]))
y x z y x z y x z y x z z y y x z x
y x z z y x
z x
x z w y
a b c d e
x
x z w y
a b c d e
x
x y z w
a b c d e
x
(define (balance node) (match node [(or (B/BB (R (R a x b) y c) z d) (B/BB (R a x (R b y c)) z d) (B/BB a x (R (R b y c) z d)) (B/BB a x (R b y (R c z d)))) ; => (T (black-1 node) (B a x b) y (B c z d))] [(BB a x (-B (B b y c) z (and d (B)))) ; => (B (B a x b) y (balance (B c z (redden d))))] [(BB (-B (and a (B)) x (B b y c)) z d) ; => (B (balance (B (redden a) x b)) y (B c z d))] [else node]))
(define (balance node) (match node [(or (B/BB (R (R a x b) y c) z d) (B/BB (R a x (R b y c)) z d) (B/BB a x (R (R b y c) z d)) (B/BB a x (R b y (R c z d)))) ; => (T (black-1 node) (B a x b) y (B c z d))] [(BB a x (-B (B b y c) z (and d (B)))) ; => (B (B a x b) y (balance (B c z (redden d))))] [(BB (-B (and a (B)) x (B b y c)) z d) ; => (B (balance (B (redden a) x b)) y (B c z d))] [else node]))
(define (balance node) (match node [(or (B/BB (R (R a x b) y c) z d) (B/BB (R a x (R b y c)) z d) (B/BB a x (R (R b y c) z d)) (B/BB a x (R b y (R c z d)))) ; => (T (black-1 node) (B a x b) y (B c z d))] [(BB a x (-B (B b y c) z (and d (B)))) ; => (B (B a x b) y (balance (B c z (redden d))))] [(BB (-B (and a (B)) x (B b y c)) z d) ; => (B (balance (B (redden a) x b)) y (B c z d))] [else node]))
matt.might.net/articles/red-black-delete @mattmight
x z w y
a b c d e
x
2 2 2 2 2
x z w y
a b c d e
x
2 2 2 2 2
x y z w
a b c d e
x
2 2 2 2 2