420 likes | 433 Views
Learn about Red-Black Trees in this lecture, covering their properties, rotations, insertion, deletion, and how they ensure small height for efficient operations. Understand RB-Tree properties, operations, ADT, rotations, and insertion fixes. Dive into RBInsertFixup and insertion cases, all explained in detail.
E N D
Algorithms and Data StructuresLecture IX Simonas Šaltenis Aalborg University simas@cs.auc.dk
This Lecture • Red-Black Trees • Properties • Rotations • Insertion • Deletion
Balanced Binary Search Trees • Problem: execution time for dynamic set operations is Q(h), which in worst case is Q(n) • Solution: balanced search trees guarantee small height – h = O(log n)
Red/Black Trees • Ared-black treeis a binary search tree with the following properties: • Nodes (incoming edges) are colored redor black • Nil-pointer leaves are black • The root is black • No two consecutiverededgeson any root-leaf path • Same number of black edgeson any root-leaf path (= black heightof the tree)
RB-Tree Properties (1) • Some measures • n – # of internal nodes • h – height • bh– black height • 2bh – 1 £ n • bh ³h/2 • 2h/2£ n +1 • h/2 £ lg(n +1) • h£ 2 lg(n +1)
RB-Tree Properties (2) • Operations in the binary-search tree (search, insert, delete, ...) can be accomplished in O(h) time • The RB-tree is a binary search tree, whose height is bound by 2 log(n +1), thus the operations run in O(log n) • Provided that we can maintain red-black tree properties spending no more than O(h) time on each insertion or deletion
nil Red-Black Tree ADT • RBTree ADT: • Accessor functions: • key():int • color(): {red, black} • parent(): RBTree • left(): RBTree • right(): RBTree • Modification procedures: • setKey(k:int) • setColor(c:{red, black}) • setParent(T:RBTree) • setLeft(T:RBTree) • setRight(T:RBTree)
NIL Sentinel • To simplify algorithms we have a special instance of the RBTree ADT – nil : • nil.color() = black • nil.right() = nil.left() = root of the tree • parent() of the root node = nil • nil.parent() and nil.key() – undefined
B A A B left rotation of A Rotation a g a g b b right rotation of B
Right Rotation A B A B a g RightRotate(B) 01 A ¬ B.left() Moveb 02 B.setLeft(A.right()) 03 A.right().setParent(B) Move A 04 ifB = B.parent().left()then B.parent().setLeft(A) 05 ifB = B.parent().right()then B.parent().setRight(A) 06 A.setParent(B.parent()) Move B 07 A.setRight(B) 08 B.setParent(A) a g b b
The Effect of a Rotation • Maintains inorder key ordering • After right rotation • Depth(a) decreases by 1 • Depth(b) stays the same • Depth(g) increases by 1 • Rotation takes O(1) time
Insertion in the RB-Trees RBInsert(T,n) 01Insert n into T using the normal binary search tree insertion procedure 02 n.setLeft(nil) 03 n.setRight(nil) 04 n.setColor(red) 05 RBIsertFixup(n)
Insertion, Plain and Simple • Let • n = the new node • p =n.parent() • g =p.parent() • Case 0: p.color() = black • No properties of the tree are violated – we are done! • In the following assume: • p = g.left()
Insertion: Case 1 • Case 1: • p.color() = red and g.right().color() = red (parent and its sibling are red) • a tree rooted at gis balanced enough! 01 p.setColor(black) 02 g.right().setColor(black) 03 g.setColor(red) 04 n¬ g // and updatep and g
Insertion: Case 1 (2) • We call this a promotion • Note how the black depth remains unchanged for all of the descendants ofg
Insertion: Case 3 • Case 3: • p.color() = red and g.right().color() = black • n = p.left() 01 p.setColor(black) 02 g.setColor(red) 03 RightRotate(g) 04 // we are done!
Insertion: Case 3 (2) • We do a right rotation and two re-colorings • Tree becomes more balanced • Black depths remain unchanged • No further work on the tree is necessary!
Insertion: Case 2 • Case 2: • p.color() = red and g.right().color() = black • n = p.right() 01 LeftRotate(p) 02 exchange n and p pointers and do as in case 3!
Insertion: Mirror cases • All three cases are handled analogously if p is a right child • For example, case 2 and 3 – right-left double rotation
Insertion: Pseudo Code RBInsertFixup(n) 01p¬n.parent() 02 g¬p.parent() 03whilep.color() = red do 04 if p = g.left() then 05 ifg.right().color() = red 06 thenp.setColor(black) 07 g.right().setColor(black) 08 g.setColor(red) 09 n¬ g // and updatep and g, as in 01,02 10 elseif n=p.right() 11 then LeftRotate(p) 12 exchangen«p 13 p.setColor(black) 14 g.setColor(red) 15 RightRotate(g) 16 else (same as then clause with ”right” and ”left” exchanged) 17 nil.left().setColor(black) // set the color of root to black Case 1 Case 2 Case 3
Insertion Summary • If twored edgesare present, we do either • a restructuring(with a simple or double rotation) and stop (cases 2 and 3), or • a promotion and continue (case 1) • A restructuring takes constant time and is performed at most once. It reorganizes an off-balanced section of the tree • Promotions may continue up the tree and are executed O(log n)times (height of the tree) • The running timeof an insertion is O(log n)
An Insertion Example • Inserting "REDSOX" into an empty tree • Now, let us insert "CUBS"
Double Rotation Example U (2)
Example B What now?
Example B (2) Right Rotation on D
Example S two red edges and red uncle X- promotion
again two red edges - rotation Example S (2)
Deletion • As with binary search trees, we can always delete a node that has at least one nil child • If the key to be deleted is stored at a node that has no external children, we move there the key of its in-order successor, and delete that node instead
Deletion Algorithm 1. Remove v 2. If v.color() = red, we are done! Else, assume that u(v’s non-nilchild or nil)getsadditional black color: • If u.color() = redthenu.setColor(black) and we are done! • Else u’ s color isdouble black.
Deletion Algorithm (2) • How to eliminate double black edges? • The intuitive idea is to perform a "color compensation" • Find a red edge nearby, and change the pair (red, double black) into (black, black) • We have two cases : • restructuring, and • recoloring • Restructuring resolves the problem locally, while recoloring may propagate it two levels up • Slightly more complicated than insertion
Deletion Case 2 • If sibling and its children are black, perform a recoloring • If parent becomes double black, continueupward
Deletion: Cases 3 and 4 • If sibling is blackand one of its children is red, perform a restructuring
Deletion Case 1 • If sibling is red, perform a rotation to get into one of cases 2, 3, and 4 • If the next case is 2 (recoloring), there is no propagation upward (parent is now red)
A Deletion Example • Delete 9
A Deletion Example (2) • Case 2 (sibling is black with black children) – recoloring
A Deletion Example (3) • Delete 8: no double black
A Deletion Example (4) • Delete 7: restructuring
How long does it take? • Deletion in a RB-tree takes O(log n) • Maximum three rotations and O(log n) recolorings
Other balanced trees • Red-Black trees are related to 2-3-4 trees (non-binary trees) • AVL-trees have simpler algorithms, but may perform a lot of rotations
Next Week • Solving optimization problems using Dynamic Programming • “Improved version” of divide-and-conquer