quiz3! midterm! assignment2! (most) quiz4! today’s special: 4 for 1

21
Quiz3! Midterm! Assignment 2! (most) Quiz4! Today’s special: 4 for 1

Upload: ashley-richard

Post on 17-Dec-2015

214 views

Category:

Documents


0 download

TRANSCRIPT

Quiz3!

Midterm!

Assignment2!

(most) Quiz4!

Today’s special: 4 for 1

Balanced trees:

Red-Black Trees

Definitions Insertion In 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

left parent

parent

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.

10

5 13

713

96

← needs two fake children

← needs two fake children

← needs one fake childneeds 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.

10

5 13

713

96

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)

579

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

4

7

12Double 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

7

4 12

Let’s insert 4, 7, 12, 15, 3 and 5.

15

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: http://gauss.ececs.uc.edu/RedBlack/redblack.html

7

4

9

3

5

6

2

1

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 practice1a) 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.