Page 1
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Set and Map ADTs: Left-Leaning Red-Black TreesCSE 373 Winter 2020
Instructor: Hannah C. Tang
Teaching Assistants:
Aaron Johnston Ethan Knutson Nathan Lipiarski
Amanda Park Farrell Fileas Sam Long
Anish Velagapudi Howard Xiao Yifan Bai
Brian Chan Jade Watkins Yuma Tou
Elena Spasova Lea Quan
Page 2
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Announcements
❖ Case-vs-Asymptotic Analysis handout released!
▪ https://courses.cs.washington.edu/courses/cse373/20wi/files/clarity_case_asymp.pdf
❖ Workshop Survey released (see Piazza)
▪ Workshop Friday @ 11:30am, CSE 203
3
Page 3
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Lecture Outline
❖ Review: 2-3 Trees and BSTs
❖ Left-Leaning Red-Black Trees
▪ Insertion
❖ Other Balanced BSTs
4
Page 4
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Review: BSTs and B-Trees
❖ Search Trees have great runtimes most of the time
▪ But they struggle with sorted (or mostly-sorted) input
▪ Must bound the height if we need runtime guarantees
❖ Plain BSTs: simple to reason about/implement. A good starting point
❖ B-Trees are a Search Tree variant that binds the height to Θ(log N) by only allowing the tree to grow from its root
▪ A good choice for a Map and/or Set implementation
5
LinkedList Map, Worst
Case
BST Map,Worst Case
B-Tree Map,Worst Case
Find Θ(N) h = Θ(N) Θ(log N)
Add Θ(N) h = Θ(N) Θ(log N)
Remove Θ(N) h = Θ(N) Θ(log N)
Page 5
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Review: 2-3 Trees
❖ 2-3 Trees are a specific type of B-Tree (with L=3)
❖ Its invariants are the same as a B-Tree’s:
1. All leaves must be the same depth from the root
2. A non-leaf node with k keys must have exactly k + 1 non-null children
❖ Example 2-3 trees:
6
2 6
4
1 3 5 7
3 5
1 2 6 74
Page 6
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Improving Search Trees
❖ Binary Search Trees (BST)
▪ Can balance a BST with rotation, but we have no fast algorithm to do so
7
❖ 2-3 Trees
▪ Balanced by construction: no rotations required
▪ Tree will split nodes as needed, but the algorithm is complicated
e
b g
o
n p
m
d f
b g
o
n p
m
e
Can we get the best of both worlds: a BST with the functionality of a 2-3 tree?
Page 7
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Converting 2-3 Tree to BST
❖ 2-3 trees with only 2-nodes(2 children) are already regular binary search trees
8
❖ How can we represent 3-nodes as a BST?
e
b g
o
n p
m
?
d f
b g
o
n p
m
e
Page 8
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Splitting 3-nodes
9
f
d
eb
g
>f
>d and <f<d
Left-leaning
f
d
e
b
g
>f>d and <f
<d
Right-leaning
d f
b ge
Page 9
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Practice:
❖ Convert this 2-3 Tree to a left-leaning BST
❖ Convert this left-leaning BST to a 2-3 Tree
11
u w
a s x yv
u
s v
y
x
w
a
f
d g
o
n p
m
b e
d f
b g
o
n p
m
e
Page 10
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Lecture Outline
❖ Review: 2-3 Trees and BSTs
❖ Left-Leaning Red-Black Trees
▪ Insertion
❖ Other Balanced BSTs
12
Page 11
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Left-Leaning Red-Black Tree
❖ Left-Leaning Red-Black (LLRB) Tree is a BST variant with the following additional invariants:
1. Every root-to-bottom* path has the same number of black edges
2. Red edges must lean left
3. No node has two red edges connected to it, either above/below or left/right
13
f
d
o
m
* “bottom” refers to single-children nodes and leaf nodes (which have no children)
f
d g
o
n p
m
b e
Page 12
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Left-Leaning Red-Black Tree == 2-3 Tree
❖ There is a 1-1 correspondence (bijection) between 2-3 trees and Left-Leaning Red-Black trees
❖ 2-nodes are the same in both trees
❖ 3-nodes are connected by a red link
❖ Left-Leaning Red-Black (LLRB) Tree
▪ Identify the link connecting the left-items in a 3-node and color it red
14
d f
b g
o
n p
m
e
f
d g
o
n p
m
b e
Page 13
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Left-Leaning Red-Black Tree == 2-3 Tree
❖ 2-3 Trees (more generally: B-Trees) are balanced search trees:
▪ height is in Θ(log N)
▪ find, insert, and remove are also in Θ(log N)
❖ Since any LLRB Tree can be a 2-3 Tree:
▪ height is in Θ(log N)
▪ find, insert, and remove are also in Θ(log N)
15
Page 14
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Left-Leaning Red-Black Tree
❖ Left-Leaning Red-Black (LLRB) Tree is a BST variant with the following additional invariants:
1. Every root-to-bottom* path has the same number of black edges
• All 2-3 tree leaf nodes are the same depth from the root
2. Red edges lean left
• We arbitrarily choose left-leaning, so we need to stick with it
3. No node has two red edges connected to it, either above/below or left/right
• This would result in an overstuffed 2-3 tree node
16
f
d g
o
n p
m
b e
d f
b g
o
n p
m
e
Page 15
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
pollev.com/uwcse373
❖ What’s the height of the corresponding Left-Leaning Red-Blacktree?
A. 3
B. 4
C. 5
D. 6
E. 7
F. I’m not sure …
17
d e p
b g j n
q r va c f h i i m o
s u
t
l
Page 16
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Height of a Left-Leaning Red-Black Tree
18
p
u
l
s
r
qGiven a 2-3 tree of height H, the corresponding LLRB tree has height: H + max(3-Nodes) = (H) + (H+1) ∈ Θ(log N)Black Edges Red Edges
Worst case when these are 3-nodes
Longest path
d e p
b g j n
q r va c f h i i m o
s u
t
l
Page 17
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Lecture Outline
❖ Review: 2-3 Trees and BSTs
❖ Left-Leaning Red-Black Trees
▪ Insertion
❖ Other Balanced BSTs
19
Pretend it’s a 2-3 tree
Page 18
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
LLRB Tree Insertion: Overall Approach
❖ Insert nodes using the “Plain BST” algorithm, but join the new node to its parent with a red edge
▪ This is analogous to how a 2-3 tree insertion always overstuffs a leaf
❖ If this results in an invalid Left-Leaning Red-Black Tree, repair
▪ This is analogous to repairing a 2-3 tree after a leaf is too full and a key needs to be promoted
20
Page 19
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
LLRB Tree
Insert: Overstuffing a Node (Left-Side)
❖ Use a red link to mimic the corresponding 2-3 tree.
21
b
ab
add(A)
2-3 Tree
badd(A)
a b
Page 20
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Overstuffing a Node (Right-Side)
❖ What is the problem with inserting a red link to the right child? What should we do to fix it?
22
2-3 Tree
badd(C)
b c
b
cb
add(C)?
Page 21
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Overstuffing a Node (Right-Side)
❖ Rotate left around B
23
2-3 Tree
badd(C)
b c
b
cb
add(C) rotateLeft(B) c
bLLRB Tree
Page 22
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Inserting to the Right Side
❖ How do we add to the right side?
24
b
a
add(C)
2-3 Tree
a badd(C)
c
b
a?
a
b
c
Page 23
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Inserting to the Right Side
❖ Recolor us and our sibling
25
b
a
add(C)
2-3 Tree
a badd(C)
a
c
b
a
b
c
recolorEdges(B)
c
b
aLLRB Tree
Page 24
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Splitting a Node
❖ How do we split a node?
26
add(C)
2-3 Tree
add(C)g
a b x
b g
a xc
b
a
x
g
c
b
a
x
g
?
Page 25
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Splitting a Node
27
add(C)
2-3 Tree
add(C)g
a b x
b g
a xc
b
a
x
g
c
b
a
x
grecolorEdges(B)
c
b
a
x
g
LLRB Tree
Page 26
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Practice
28
add(E)
2-3 Tree
add(E)b
a s z
b s
a ze
a
s
z
b
?a
s
z
b
e
Page 27
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Practice
29
add(E)
2-3 Tree
add(E)b
a s z
b s
a ze
?a
s
z
b
e
rotateRight(Z)
a
e
s
b
z
a
e
s
b
z
recolorEdges(S)
Page 28
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Practice
30
2-3 Tree
add(E)b
a s z
b s
a ze
a
e
s
b
z
recolorEdges(S) rotateLeft(B)
b
a
z
s
e
LLRB Tree
Page 29
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Left-Leaning Red-Black Tree Invariants
❖ Left-Leaning Red-Black (LLRB) Tree is a BST variant with the following additional invariants:
1. Every root-to-bottom path has the same number of black edges
2. Red edges lean left
3. No node has two red edges connected to it, either above/below or left/right
❖ When repairing an LLRB Tree, use the following recipes:
▪ Right link red? Rotate left
▪ Two left reds in a row? Rotate right
▪ Both children red? Recolor all edges leaving the node
31
Page 30
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Insert: Java Implementation
private Node insert(Node h, Key key, Value value) {
if (h == null) { return new Node(key, value, RED); }
int cmp = key.compareTo(h.key);
if (cmp < 0) { h.left = insert(h.left, key, val); }
else if (cmp > 0) { h.right = insert(h.right, key, val); }
else { h.value = value; }
if (isRed(h.right) && !isRed(h.left)) { h = rotateLeft(h); }
if (isRed(h.left) && isRed(h.left.left)) { h = rotateRight(h); }
if (isRed(h.left) && isRed(h.right)) { recolorEdges (h); }
return h;
}
32
Right link red? Rotate left
Two left reds in a row? Rotate right
Both children red? Recolor all edges leaving node
Page 31
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Left-Leaning Red-Black Trees Runtime
❖ Searching for a key is the same as a BST
❖ Tree height is guaranteed in Θ(log N)
❖ Inserting a key is a recursive process
▪ Θ(log N) to add(E)
▪ Θ(log N) to maintain invariants
33
A
S
Z
B
E
add(E)B
A
Z
S
E
rotateRight(Z)recolorEdges(S)rotateLeft(B)
Page 32
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Lecture Outline
❖ Review: 2-3 Trees and BSTs
❖ Left-Leaning Red-Black Trees
▪ Insertion
❖ Other Balanced BSTs
34
Page 33
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
Red-Black Trees
❖ Left-leaning Red-Black trees:
▪ Invented 2008 as a “simpler-to-implement” Red-Black tree
❖ Red-black trees:
▪ Invented 1972 (!!) and handles the “right-leaning” case
▪ Nodes, not edges, are colored red/black
▪ Used millions (billions?) of times as a second: Java TreeMap, C++ Map, Linux scheduler and epoll, …
▪ You will get to use (but not implement) in HW4!
35
Page 34
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
AVL Trees
❖ Recursively balanced with equal heights = not flexible enough
▪ Can only represent inputs of size 2n - 1
❖ Recursively balanced with heights differing <=1
▪ AVL tree!
❖ Insertions: add to leaf, then log N rotations until tree is rebalanced
❖ Deletions: lol
36
Page 35
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
… and Still More
❖ Order Statistic Tree
❖ Interval Tree
❖ Splay Tree
❖ Dancing Tree
❖ And so much more!
37
Page 36
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
tl;dr (1 of 2)
❖ Search Trees have great runtimes most of the time
▪ But they struggle with sorted (or mostly-sorted) input
▪ Must bound the height if we need runtime guarantees
❖ Plain BSTs: simple to reason about/implement. A good starting point
❖ Left-leaning Red-Black Trees: A BST variant with a Θ(log N) bound on the height
▪ Invariants quite tricky, but implementation isn’t bad!
▪ Correctness and runtimes guaranteed by 1-1 mapping with 2-3 trees
38
Page 37
CSE373, Winter 2020L09: Left-Leaning Red-Black Trees
tl;dr (2 of 2)
❖ B-Trees are a Search Tree variant with a Θ(log2N) bound on the height
▪ Only allows the tree to grow from its root
▪ Added two simple invariants, but implementation quite tricky
• All leaves must be the same depth from the root
• A non-leaf node with k keys must have exactly k+1 non-null children
❖ Possible data structures for a Map and/or Set ADT:
39
LinkedList Map, Worst Case
BST Map,Worst Case
B-Tree Map,Worst Case
LLRBT Map,Worst Case
Find Θ(N) h = Θ(N) Θ(log N) Θ(log N)
Add Θ(N) h = Θ(N) Θ(log N) Θ(log N)
Remove Θ(N) h = Θ(N) Θ(log N) Θ(log N)