Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Today’s special: 4 for 1 Quiz3! Midterm! Assignment2! (most) Quiz4! Balanced trees: Red-Black Trees Definitions Insertion In a nutshell Definition: an extended Node 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. public class RBNode extends Node{ private Node parent; private boolean color; // true for black, false for red right parent public RBNode(int key, Object data) { super(key, data); parent = null; color = true; } left parent } Balanced trees: Red-black trees Definition: Red-Black Tree • Each node must have exactly two children. For each child that is lacking, you create a fake black one. 10 13 5 needs two fake children → 7 13 6 ← needs two fake children ← needs one fake child 9 ← needs two fake children Balanced trees: Red-black trees Definition: Red-Black Tree • Each node must have exactly two children. For each child that is lacking, you create a fake black one. 10 13 5 In practice, don’t bother drawing them. 7 13 6 Think of those as gostly nodes: they are not really there… 9 Balanced trees: Red-black trees Definition: Red-Black Tree • 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. Balanced trees: Red-black trees Example The root is black. The children of red nodes are both black. Balanced trees: Red-black trees Example The root is black. The children of red nodes are both black. Balanced trees: Red-black trees Algorithm: Insertion A red-black tree is a particular binary search tree, so create a new node as red and insert it. 5 7 9 7 Violation! What property may be violated? The children of a red node must be black. (similarly to an AVL: you insert the node, that may screw up a few properties, so you try to fix them after) Balanced trees: Red-black trees Algorithm: Insertion There are different situations, and fixing them follows a very scientific and rigorous process. Balanced trees: Red-black trees Algorithm: Insertion 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 Balanced trees: Red-black trees Algorithm: Insertion 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) Balanced trees: Red-black trees Algorithm: Insertion 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 right childand andhas hasa ablack blackuncle: uncle,colour then rotateLeft(z.parent) left child the parent black andand the grandparent red, then rotateRight(z.parent.parent) Balanced trees: Red-black trees Algorithm: Insertion Let’s insert 4, 7, 12, 15, 3 and 5. 4 7 12 Double red violation! It also shows it’s unbalanced… Balanced trees: Red-black trees Algorithm: Insertion Let’s insert 4, 7, 12, 15, 3 and 5. 7 What should we do? Nothing, no double red. 3 4 12 5 15 Double red violation. We can’t have a better balance, and there is a red uncle… Balanced trees: Red-black trees Algorithm: Insertion To practice more: http://gauss.ececs.uc.edu/RedBlack/redblack.html 7 4 9 3 5 6 2 1 Balanced trees: Red-black trees In a nutshell: What to optimize? Which operation matters? We have seen how to use three primitive structures: arrays, simple pointers (as in a LinkedList) and trees. If we want to optimize the access, which primitive would you choose? 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? 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. What about we want to optimize insertion and access? 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? 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. 2b) Write showPathReverse(int key1, int key2) that will show the keys in the other order (from key2 to key1). 2c) Write showPathReverse(int key1, int key2) without recursive calls. Balanced trees: Red-black trees