430 likes | 468 Views
Red-Black Trees. Red-black trees: Overview. Red-black trees are a variation of binary search trees to ensure that the tree is balanced . Height is O (lg n ), where n is the number of nodes. Operations take O (lg n ) time in the worst case .
E N D
Red-Black Trees Comp 122, Spring 2004
Red-black trees: Overview • Red-black trees are a variation of binary search trees to ensure that the tree is balanced. • Height is O(lg n), where n is the number of nodes. • Operations take O(lg n) time in the worst case. • Published by my PhD supervisor, Leo Guibas, and Bob Sedgewick. • Easiest of the balanced search trees, so they are used in STL map operations… Comp 122, Spring 2004
Hysteresis : or the value of lazyness • Hysteresis, n. [fr. Gr. to be behind, to lag.] a retardation of an effect when the forces acting upon a body are changed (as if from viscosity or internal friction); especially: a lagging in the values of resulting magnetization in a magnetic material (as iron) due to a changing magnetizing force Comp 122, Spring 2004
Red-black Tree • Binary search tree + 1 bit per node: the attribute color, which is either red or black. • All other attributes of BSTs are inherited: • key, left, right, and p. • All empty trees (leaves) are colored black. • We use a single sentinel, nil, for all the leaves of red-black tree T, with color[nil] = black. • The root’s parent is also nil[T ]. Comp 122, Spring 2004
Red-black Properties • Every node is either red or black. • The root is black. • Every leaf (nil) is black. • If a node is red, then both its children are black. • For each node, all paths from the node to descendant leaves contain the same number of black nodes. Comp 122, Spring 2004
Red-black Tree – Example nil[T] 26 Remember: every internal node has two children, even though nil leaves are not usually shown. 17 41 30 47 38 50 Comp 122, Spring 2004
Height of a Red-black Tree • Height of a node: • h(x) = number of edges in a longest path to a leaf. • Black-height of a node x, bh(x): • bh(x)= number of black nodes (including nil[T ]) on the path from x to leaf, not counting x. • Black-height of a red-black tree is the black-height of its root. • By Property 5, black height is well defined. Comp 122, Spring 2004
Height of a Red-black Tree Example: Height of a node: h(x) = # of edges in a longest path to a leaf. Black-height of a node bh(x)= # of black nodes on path from x to leaf, not counting x. How are they related? bh(x) ≤h(x) ≤ 2 bh(x) h=4 bh=2 26 h=3 bh=2 h=1 bh=1 17 41 h=2 bh=1 h=2 bh=1 30 47 h=1 bh=1 38 h=1 bh=1 50 nil[T] Comp 122, Spring 2004
Lemma “RB Height” Consider a node x in an RB tree: The longest descending path from x to a leaf has length h(x), which is at most twice the length of the shortest descending path from x to a leaf. Proof: # black nodes on any path from x = bh(x) (prop 5) • # nodes on shortest path from x, s(x). (prop 1) But, there are no consecutive red (prop 4), and we end with black (prop 3), so h(x) ≤ 2 bh(x). Thus, h(x) ≤ 2 s(x).QED Comp 122, Spring 2004
Bound on RB Tree Height • Lemma: The subtree rooted at any node x has 2bh(x)–1 internal nodes. • Proof:By induction on height of x. • Base Case:Heighth(x) = 0 x is a leaf bh(x)= 0.Subtree has 20–1 = 0 nodes. • Induction Step: Height h(x) = h > 0and bh(x)= b. • Each child of x has height h - 1 and black-height either b (child is red) or b - 1 (child is black). • By ind. hyp., each child has 2bh(x)– 1–1 internal nodes. • Subtree rooted at x has 2 (2bh(x) – 1– 1)+1 = 2bh(x)– 1 internal nodes. (The +1 is for x itself.) Comp 122, Spring 2004
Bound on RB Tree Height • Lemma: The subtree rooted at any node x has 2bh(x)–1 internal nodes. • Lemma 13.1: A red-black tree with n internal nodes has height at most 2 lg(n+1). • Proof: • By the above lemma, n 2bh–1, • and since bh h/2, we have n 2h/2–1. • h 2 lg(n + 1). Comp 122, Spring 2004
Operations on RB Trees • All operations can be performed in O(lg n) time. • The query operations, which don’t modify the tree, are performed in exactly the same way as they are in BSTs. • Insertion and Deletion are not straightforward. Why? Comp 122, Spring 2004
Rotations Left-Rotate(T, x) y x x Right-Rotate(T, y) y Comp 122, Spring 2004
Rotations Left-Rotate(T, x) y x x Right-Rotate(T, y) y • Rotations are the basic tree-restructuring operation for almost all balanced search trees. • Rotation takes a red-black-tree and a node, • Changes pointers to change the local structure, and • Won’t violate the binary-search-tree property. • Left rotation and right rotation are inverses. Comp 122, Spring 2004
Left Rotation – Pseudo-code Left-Rotate(T, x) y x Right-Rotate(T, y) x y Left-Rotate (T, x) • y right[x] // Set y. • right[x] left[y] //Turn y’s left subtree into x’s right subtree. • if left[y] nil[T ] • then p[left[y]] x • p[y] p[x] // Link x’s parent to y. • if p[x] = nil[T ] • then root[T ] y • else if x = left[p[x]] • then left[p[x]] y • else right[p[x]] y • left[y] x // Put x on y’s left. • p[x] y Comp 122, Spring 2004
Rotation • The pseudo-code for Left-Rotate assumes that • right[x] nil[T ], and • root’s parent is nil[T ]. • Left Rotation on x, makes x the left child of y, and the left subtree of y into the right subtree of x. • Pseudocode for Right-Rotate is symmetric: exchange left and right everywhere. • Time:O(1)for both Left-Rotate and Right-Rotate, since a constant number of pointers are modified. Comp 122, Spring 2004
Reminder: Red-black Properties • Every node is either red or black. • The root is black. • Every leaf (nil) is black. • If a node is red, then both its children are black. • For each node, all paths from the node to descendant leaves contain the same number of black nodes. Comp 122, Spring 2004
Insertion in RB Trees • Insertion must preserve all red-black properties. • Should an inserted node be coloredRed? Black? • Basic steps: • Use Tree-Insert from BST (slightly modified) to insert a node x into T. • Procedure RB-Insert(x). • Color the node x red. • Fix the modified tree by re-coloring nodes and performing rotation to preserve RB tree property. • Procedure RB-Insert-Fixup. Comp 122, Spring 2004
Insertion RB-Insert(T, z) Contd. left[z] nil[T] right[z] nil[T] color[z] RED RB-Insert-Fixup (T, z) RB-Insert(T, z) • y nil[T] • x root[T] • whilex nil[T] • doy x • ifkey[z] < key[x] • thenx left[x] • elsex right[x] • p[z] y • if y = nil[T] • thenroot[T] z • elseifkey[z] < key[y] • then left[y] z • elseright[y] z How does it differ from the Tree-Insert procedure of BSTs? Which of the RB properties might be violated? Fix the violations by calling RB-Insert-Fixup. Comp 122, Spring 2004
Insertion – Fixup Comp 122, Spring 2004
Insertion – Fixup • Problem: we may have one pair of consecutive reds where we did the insertion. • Solution: rotate it up the tree and away…Three cases have to be handled… • http://www2.latech.edu/~apaun/RBTreeDemo.htm Comp 122, Spring 2004
Insertion – Fixup RB-Insert-Fixup (T, z) • while color[p[z]] = RED • do if p[z] = left[p[p[z]]] • then y right[p[p[z]]] • if color[y] = RED • then color[p[z]] BLACK // Case 1 • color[y] BLACK // Case 1 • color[p[p[z]]] RED // Case 1 • z p[p[z]] // Case 1 Comp 122, Spring 2004
Insertion – Fixup RB-Insert-Fixup(T, z)(Contd.) else if z = right[p[z]] // color[y] RED then z p[z] // Case 2 LEFT-ROTATE(T, z)// Case 2 color[p[z]] BLACK // Case 3 color[p[p[z]]] RED // Case 3 RIGHT-ROTATE(T, p[p[z]])// Case 3 else (if p[z] = right[p[p[z]]])(same as 10-14 with “right” and “left” exchanged) color[root[T ]] BLACK Comp 122, Spring 2004
Correctness Loop invariant: • At the start of each iteration of the whileloop, • z is red. • If p[z] is the root, then p[z] is black. • There is at most one red-black violation: • Property 2:z is a red root, or • Property 4:z and p[z] are both red. Comp 122, Spring 2004
Correctness – Contd. • Initialization: • Termination:The loop terminates only if p[z] is black. Hence, property 4 is OK. The last line ensures property 2 always holds. • Maintenance:We drop out when z is the root (since then p[z] is sentinel nil[T ], which is black). When we start the loop body, the only violation is of property 4. • There are 6 cases, 3 of which are symmetric to the other 3. We consider cases in which p[z] is a left child. • Let y be z’s uncle (p[z]’s sibling). Comp 122, Spring 2004
Case 1 – uncle y is red p[p[z]] new z C C p[z] • p[p[z]] (z’s grandparent) must be black, since z and p[z] are both red and there are no other violations of property 4. • Make p[z] and y black now z and p[z] are not both red. But property 5 might now be violated. • Make p[p[z]] red restores property 5. • The next iteration has p[p[z]] as the new z (i.e., z moves up 2 levels). y A D A D z B B z is a right child here. Similar steps if z is a left child. Comp 122, Spring 2004
Case 2 – y is black, z is a right child C C p[z] • Left rotate around p[z], p[z] and z switch roles now z is a left child, and both z and p[z] are red. • Takes us immediately to case 3. p[z] A y B y z z A B Comp 122, Spring 2004
Case 3 – y is black, z is a left child B C • Make p[z] black and p[p[z]] red. • Then right rotate on p[p[z]]. Ensures property 4 is maintained. • No longer have 2 reds in a row. • p[z] is now black no more iterations. p[z] A C B y z A Comp 122, Spring 2004
Algorithm Analysis • O(lg n)time to get through RB-Insert up to the call of RB-Insert-Fixup. • Within RB-Insert-Fixup: • Each iteration takes O(1)time. • Each iteration butthe last moves z up 2 levels. • O(lg n)levels O(lg n)time. • Thus, insertion in a red-black tree takes O(lg n)time. • Note: there are at most 2 rotations overall. Comp 122, Spring 2004
Deletion • Deletion, like insertion, should preserve all the RB properties. • The properties that may be violated depends on the color of the deleted node. • Red – OK. Why? • Black? • Steps: • Do regular BST deletion. • Fix any violations of RB properties that may result. Comp 122, Spring 2004
Deletion RB-Delete(T, z) • if left[z] = nil[T] or right[z] = nil[T] • then y z • else y TREE-SUCCESSOR(z) • if left[y] = nil[T ] • then x left[y] • else x right[y] • p[x] p[y] // Do this, even if x is nil[T] Comp 122, Spring 2004
Deletion RB-Delete (T, z) (Contd.) • if p[y] = nil[T ] • then root[T ] x • else if y = left[p[y]] • then left[p[y]] x • else right[p[y]] x • if y = z • then key[z] key[y] • copy y’s satellite data into z • if color[y] = BLACK • then RB-Delete-Fixup(T, x) • return y The node passed to the fixup routine is the lone child of the spliced up node, or the sentinel. Comp 122, Spring 2004
RB Properties Violation • If y is black, we could have violations of red-black properties: • Prop. 1. OK. • Prop. 2. If y is the root and x is red, then the root has become red. • Prop. 3. OK. • Prop. 4. Violation if p[y] and x are both red. • Prop. 5. Any path containing y now has 1 fewer black node. Comp 122, Spring 2004
RB Properties Violation • Prop. 5. Any path containing y now has 1 fewer black node. • Correct by giving x an “extra black.” • Add 1 to count of black nodes on paths containing x. • Now property 5 is OK, but property 1 is not. • x is either doubly black(if color[x] = BLACK) or red & black(if color[x] = RED). • The attribute color[x] is still either RED or BLACK. No new values for color attribute. • In other words, the extra blackness on a node is by virtue of x pointing to the node. • Remove the violations by calling RB-Delete-Fixup. Comp 122, Spring 2004
Deletion – Fixup RB-Delete-Fixup(T, x) • while x root[T ] and color[x] = BLACK • do if x = left[p[x]] • then w right[p[x]] • if color[w] = RED • then color[w] BLACK // Case 1 • color[p[x]] RED // Case 1 • LEFT-ROTATE(T, p[x]) // Case 1 • w right[p[x]] // Case 1 Comp 122, Spring 2004
RB-Delete-Fixup(T, x) (Contd.) /* x is still left[p[x]] */ • if color[left[w]] = BLACK and color[right[w]] = BLACK • then color[w] RED // Case 2 • x p[x] // Case 2 • else if color[right[w]] = BLACK • then color[left[w]] BLACK // Case 3 • color[w] RED // Case 3 • RIGHT-ROTATE(T,w)// Case 3 • w right[p[x]] // Case 3 • color[w] color[p[x]] // Case 4 • color[p[x]] BLACK // Case 4 • color[right[w]] BLACK // Case 4 • LEFT-ROTATE(T, p[x]) // Case 4 • x root[T ] // Case 4 • else (same as then clause with “right” and “left” exchanged) • color[x] BLACK Comp 122, Spring 2004
Deletion – Fixup • Idea:Move the extra black up the tree until x points to a red & black node turn it into a black node, • x points to the root just remove the extra black, or • We can do certain rotations and recolorings and finish. • Within the while loop: • x always points to a nonroot doubly black node. • w is x’s sibling. • w cannot be nil[T ], since that would violate property 5 at p[x]. • 8 cases in all, 4 of which are symmetric to the other. Comp 122, Spring 2004
Case 1 – w is red p[x] B • w must have black children. • Make w black and p[x] red (because w is red p[x] couldn’t have been red). • Then left rotate on p[x]. • New sibling of x was a child of w before rotation must be black. • Go immediately to case 2, 3, or 4. D w x B E A D x new w A C C E Comp 122, Spring 2004
Case 2 – w is black, both w’s children are black p[x] new x c c B • Take 1 black off x (singly black) and off w (red). • Move that black to p[x]. • Do the next iteration with p[x] as the new x. • If entered this case from case 1, then p[x] was red new x is red & black color attribute of new x is RED loop terminates. Then new x is made black in the last line. B w x A D A D C E C E Comp 122, Spring 2004
Case 3 – w is black, w’s left child is red, w’s right child is black c c B • Make w red and w’s left child black. • Then right rotate on w. • New sibling w of x is black with a red right child case 4. B w x x new w A D A C D C E E Comp 122, Spring 2004
Case 4 – w is black, w’s right child is red c B • Make w be p[x]’s color (c). • Make p[x] black and w’s right child black. • Then left rotate on p[x]. • Remove the extra black on x (x is now singly black) without violating any red-black properties. • All done. Setting x to root causes the loop to terminate. D w x B E A D x c’ A C C E Comp 122, Spring 2004
Analysis • O(lg n)time to get through RB-Delete up to the call of RB-Delete-Fixup. • Within RB-Delete-Fixup: • Case 2 is the only case in which more iterations occur. • x moves up 1 level. • Hence, O(lg n)iterations. • Each of cases 1, 3, and 4 has 1 rotation 3 rotations in all. • Hence, O(lg n)time. Comp 122, Spring 2004
Hysteresis : or the value of lazyness • The red nodes give us some slack – we don’t have to keep the tree perfectly balanced. • The colors make the analysis and code much easier than some other types of balanced trees. • Still, these aren’t free – balancing costs some time on insertion and deletion. Comp 122, Spring 2004