Quiz3! Midterm! Assignment2! (most) Quiz4! Today’s special: 4 for 1
Balanced trees: Red-Black Trees
DefinitionsInsertionIn a nutshell
Definition: an extended Node Balanced trees: Red-black trees Before, all our nodes were born equals. In a red-black tree, a node is either red or black. For some algorithms, it is easier to have a pointer to the parent. right leftparent public class RBNode extends Node{ private Node parent; private boolean color; // true for black, false for red public RBNode(int key, Object data) { super(key, data); parent = null; color = true; } }
Definition: Red-Black Tree Balanced trees: Red-black trees Each node must have exactly two children. For each child that is lacking, you create a fake black one ← needs two fake children ← needs one fake child needs two fake children →
Definition: Red-Black Tree Balanced trees: Red-black trees Each node must have exactly two children. For each child that is lacking, you create a fake black one Think of those as gostly nodes: they are not really there… In practice, don’t bother drawing them.
Definition: Red-Black Tree Balanced trees: Red-black trees Each node must have exactly two children. For each child that is lacking, you create a fake black one. The root is black. Every path from a node to a leaf contains the same number of black nodes. If a node is red then both its children must be black.
Example Balanced trees: Red-black trees The root is black. The children of red nodes are both black.
Example Balanced trees: Red-black trees The root is black. The children of red nodes are both black.
The children of a red node must be black. Algorithm: Insertion Balanced trees: Red-black trees A red-black tree is a particular binary search tree, so create a new node as red and insert it. What property may be violated? (similarly to an AVL: you insert the node, that may screw up a few properties, so you try to fix them after) 5 79 Violation! 7
Balanced trees: Red-black trees Algorithm: Insertion There are different situations, and fixing them follows a very scientific and rigorous process.
Algorithm: Insertion Balanced trees: Red-black trees We have detected a need for balance when z is red and his parent too. If z has a red uncle: colour the parent and uncle black, and grandparent red. z
Algorithm: Insertion Balanced trees: Red-black trees We have detected a need for balance when z is red and his parent too. If z has a red uncle: colour the parent and uncle black, and grandparent red. If z is a left child and has a black uncle: colour the parent black and the grandparent red, then rotateRight(z.parent.parent)
Algorithm: Insertion Balanced trees: Red-black trees We have detected a need for balance when z is red and his parent too. If z has a red uncle: colour the parent and uncle black, and grandparent red. If z is a left child and has a black uncle: colour the parent black and the grandparent red, then rotateRight(z.parent.parent) If z is a right child and has a black uncle, then rotateLeft(z.parent) and
Algorithm: Insertion Balanced trees: Red-black trees Double red violation! It also shows it’s unbalanced… Let’s insert 4, 7, 12, 15, 3 and 5.
Algorithm: Insertion Balanced trees: Red-black trees Let’s insert 4, 7, 12, 15, 3 and Double red violation. We can’t have a better balance, and there is a red uncle… 3 What should we do? Nothing, no double red. 5
Algorithm: Insertion Balanced trees: Red-black trees To practice more:
In a nutshell: What to optimize?
Which operation matters? Balanced trees: Red-black trees If we want to optimize the access, which primitive would you choose? We have seen how to use three primitive structures: arrays, simple pointers (as in a LinkedList) and trees. An array, because access is in O(1). If we want to optimize the insertion, which primitive would you choose? Pointers with a shortcut to the tail. Inserting at the end will be O(1). What about we want to optimize insertion and access?
Balanced trees: Red-black trees Which operation matters? What about we want to optimize insertion and access? You can’t have O(1) for both. But with a balanced tree you get O(log n). If you want to optimize one operation, go for arrays or simple pointers. Beyond, use a tree.
Balanced trees: Red-black trees A bit of practice 1a) Write a method findAllElements that returns the content of a binary search tree as a LinkedList L. 1b) Let say that we delete the tree and we add all the elements from L to the tree again, from first to last. How can you ensure that we will get the same tree back? 2b) Write showPathReverse(int key1, int key2) that will show the keys in the other order (from key2 to key1). 2a) Write a method showPath(int key1, int key2) that will show the keys on the path from key1 to key2. Assume both keys exist. 2c) Write showPathReverse(int key1, int key2) without recursive calls.