C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Red Black TreeA Red Black Tree is a category of the self-balancing binary search tree. It was created in 1972 by Rudolf Bayer who termed them "symmetric binary B-trees." A red-black tree is a Binary tree where a particular node has color as an extra attribute, either red or black. By check the node colors on any simple path from the root to a leaf, red-black trees secure that no such path is higher than twice as long as any other so that the tree is generally balanced. Properties of Red-Black TreesA red-black tree must satisfy these properties:
A tree T is an almost red-black tree (ARB tree) if the root is red, but other conditions above hold. ![]() Operations on RB Trees:The search-tree operations TREE-INSERT and TREE-DELETE, when runs on a red-black tree with n keys, take O (log n) time. Because they customize the tree, the conclusion may violate the red-black properties. To restore these properties, we must change the color of some of the nodes in the tree and also change the pointer structure. 1. Rotation:Restructuring operations on red-black trees can generally be expressed more clearly in details of the rotation operation. ![]() Clearly, the order (Ax By C) is preserved by the rotation operation. Therefore, if we start with a BST and only restructure using rotation, then we will still have a BST i.e. rotation do not break the BST-Property. LEFT ROTATE (T, x) 1. y ← right [x] 1. y ← right [x] 2. right [x] ← left [y] 3. p [left[y]] ← x 4. p[y] ← p[x] 5. 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 6. left [y] ← x. 7. p [x] ← y. Example: Draw the complete binary tree of height 3 on the keys {1, 2, 3... 15}. Add the NIL leaves and color the nodes in three different ways such that the black heights of the resulting trees are: 2, 3 and 4. Solution: ![]() Tree with black-height-2 ![]() Tree with black-height-3 ![]() Tree with black-height-4 2. Insertion:
A discrepancy can decision from a parent and a child both having a red color. This type of discrepancy is determined by the location of the node concerning grandparent, and the color of the sibling of the parent. RB-INSERT (T, z) 1. y ← nil [T] 2. x ← root [T] 3. while x ≠ NIL [T] 4. do y ← x 5. if key [z] < key [x] 6. then x ← left [x] 7. else x ← right [x] 8. p [z] ← y 9. if y = nil [T] 10. then root [T] ← z 11. else if key [z] < key [y] 12. then left [y] ← z 13. else right [y] ← z 14. left [z] ← nil [T] 15. right [z] ← nil [T] 16. color [z] ← RED 17. RB-INSERT-FIXUP (T, z) After the insert new node, Coloring this new node into black may violate the black-height conditions and coloring this new node into red may violate coloring conditions i.e. root is black and red node has no red children. We know the black-height violations are hard. So we color the node red. After this, if there is any color violation, then we have to correct them by an RB-INSERT-FIXUP procedure. RB-INSERT-FIXUP (T, z) 1. while color [p[z]] = RED 2. do if p [z] = left [p[p[z]]] 3. then y ← right [p[p[z]]] 4. If color [y] = RED 5. then color [p[z]] ← BLACK //Case 1 6. color [y] ← BLACK //Case 1 7. color [p[z]] ← RED //Case 1 8. z ← p[p[z]] //Case 1 9. else if z= right [p[z]] 10. then z ← p [z] //Case 2 11. LEFT-ROTATE (T, z) //Case 2 12. color [p[z]] ← BLACK //Case 3 13. color [p [p[z]]] ← RED //Case 3 14. RIGHT-ROTATE (T,p [p[z]]) //Case 3 15. else (same as then clause) With "right" and "left" exchanged 16. color [root[T]] ← BLACK Example: Show the red-black trees that result after successively inserting the keys 41,38,31,12,19,8 into an initially empty red-black tree. Solution:Insert 41 ![]() ![]() ![]() ![]() Insert 19 ![]() ![]() Thus the final tree is ![]() 3. Deletion:First, search for an element to be deleted
The strategy RB-DELETE is a minor change of the TREE-DELETE procedure. After splicing out a node, it calls an auxiliary procedure RB-DELETE-FIXUP that changes colors and performs rotation to restore the red-black properties. RB-DELETE (T, z) 1. if left [z] = nil [T] or right [z] = nil [T] 2. then y ← z 3. else y ← TREE-SUCCESSOR (z) 4. if left [y] ≠ nil [T] 5. then x ← left [y] 6. else x ← right [y] 7. p [x] ← p [y] 8. if p[y] = nil [T] 9. then root [T] ← x 10. else if y = left [p[y]] 11. then left [p[y]] ← x 12. else right [p[y]] ← x 13. if y≠ z 14. then key [z] ← key [y] 15. copy y's satellite data into z 16. if color [y] = BLACK 17. then RB-delete-FIXUP (T, x) 18. return y RB-DELETE-FIXUP (T, x) 1. while x ≠ root [T] and color [x] = BLACK 2. do if x = left [p[x]] 3. then w ← right [p[x]] 4. if color [w] = RED 5. then color [w] ← BLACK //Case 1 6. color [p[x]] ← RED //Case 1 7. LEFT-ROTATE (T, p [x]) //Case 1 8. w ← right [p[x]] //Case 1 9. If color [left [w]] = BLACK and color [right[w]] = BLACK 10. then color [w] ← RED //Case 2 11. x ← p[x] //Case 2 12. else if color [right [w]] = BLACK 13. then color [left[w]] ← BLACK //Case 3 14. color [w] ← RED //Case 3 15. RIGHT-ROTATE (T, w) //Case 3 16. w ← right [p[x]] //Case 3 17. color [w] ← color [p[x]] //Case 4 18. color p[x] ← BLACK //Case 4 19. color [right [w]] ← BLACK //Case 4 20. LEFT-ROTATE (T, p [x]) //Case 4 21. x ← root [T] //Case 4 22. else (same as then clause with "right" and "left" exchanged) 23. color [x] ← BLACK Example: In a previous example, we found that the red-black tree that results from successively inserting the keys 41,38,31,12,19,8 into an initially empty tree. Now show the red-black trees that result from the successful deletion of the keys in the order 8, 12, 19,31,38,41. Solution: ![]() ![]() ![]() ![]() Delete 38 ![]() Delete 41 No Tree.
Next TopicDynamic Programming
|