binary search trees - people.cs.aau.dkpeople.cs.aau.dk/.../aa1-06/09-binarysearchtrees.pdf ·...

21
Binary Search Trees Alexandre David B2-206

Upload: others

Post on 24-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

Binary Search Trees

Alexandre DavidB2-206

Page 2: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 2

IntroductionBinary tree: Every node in the tree at most 2 children.Support for many operations, e.g., search, min, max, predecessor, successor, insert, delete.Suitable as dictionaries and priority queues.Important parameter: height of the tree.

Basic operation proportional to the height.E[height] of randomly built binary tree Θ( lgn).

Page 3: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 3

Binary Trees

/

/ /

/ // // // /

top

left right

/

Page 4: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 4

Binary Search TreesBinary tree with keys satisfying:

For a node x and a node y in the left sub-tree of x, key(y)≤key(x).For a node x and a node y in the right sub-tree of x, key(y)≥key(x).Similar to quick-sort.

x

y

x

y≤ ≥

Page 5: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 5

Binary Search TreesFeature: Different binary search trees may represent the same set of values.

The tree depends on the order the values were inserted.

5

3 7

2 5 8

2

3

7

5

5

8

Which one isbetter?

Page 6: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 6

In-order WalkPrint all the element in sorted order.

Correctness from the binary search tree properties.Time Θ(n).?

Proof: One call per node, n nodes⇒ n calls. Θ(1) per call ⇒ Θ(n).

inorder_tree_walk(x):if x ≠ NIL then

inorder_tree_walk(left(x))print_key(x)inorder_tree_walk(right(x))

fi

Print all elements ≤ x.Print x.Print all elements ≥ x.

Page 7: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 7

Pre/post-order Walks

preorder_tree_walk(x):if x ≠ NIL then

print_key(x)inorder_tree_walk(left(x))inorder_tree_walk(right(x))

fi postorder_tree_walk(x):if x ≠ NIL then

inorder_tree_walk(left(x))inorder_tree_walk(right(x))print_key(x)

fi

print before

print after

Page 8: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 8

SearchingRunning time isO(height), withE[height]=lgn.

tree_search(x,k):while x ≠ NIL and k ≠ key(x) do

if k < key(x) thenx = left(x)

elsex = right(x)

fidonereturn x

tree_min(x):y = xwhile x ≠ NIL do

y = xx = left(x)

donereturn y

tree_max(x):y = xwhile x ≠ NIL do

y = xx = right(x)

donereturn y

Why are these correct?

Similar tobinary searchfor sortedarrays.

Page 9: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 9

SuccessorsSorted Enumeration

tree_successor(x):if right(x) ≠ NIL then

return tree_min(right(x))fiy = parent(x)while y ≠ NIL and x == right(y) do

x = yy = parent(y)

donereturn y

O(height)

successor( )?x

11 There is a rightsub-tree, next greaterelement = min(right(x))

x ≤≤

Page 10: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 10

SuccessorsSorted Enumeration

tree_successor(x):if right(x) ≠ NIL then

return tree_min(right(x))fiy = parent(x)while y ≠ NIL and x == right(y) do

x = yy = parent(y)

donereturn y

O(height)

successor( )?x

2x≤

not hereno rightsub-tree

ygo up &search next

greater node

3

y

x

up from left: up from right:

x≤ x

Page 11: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 11

SuccessorsSorted Enumeration

tree_successor(x):if right(x) ≠ NIL then

return tree_min(right(x))fiy = parent(x)while y ≠ NIL and x == right(y) do

x = yy = parent(y)

donereturn y

5

3 7

2 5 8

4

tree_enumerate(root):x = tree_min(root)while x ≠ NIL do

print(x)x = tree_successor(x)

doneroot

Page 12: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 12

InsertionWe insert an element ⇒ change the tree but keep the binary search tree property.Idea: Add a leaf and fix the tree.

tree_insert(T,z):y = search_leaf(T,z)parent(z) = yfix_child(y,z)

Page 13: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 13

Insertion – Find Right Leafsearch_leaf(T,z):y = NILx = root(T)while x ≠ NIL do

y = xif key(z) < key(x) then

x = left(x)else

x = right(x)fi

donereturn y

7

3 8

2 5 9

4

6 ?

y

tree_insert(T,z):y = search_leaf(T,z)parent(z) = yfix_child(y,z)

Page 14: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 14

Insertion – Fix The Tree

tree_insert(T,z):y = search_leaf(T,z)parent(z) = yfix_child(y,z)

7

3 8

2 5 9

4 6

fix_child(y,z):if y = NIL then

root(T) = zelse

if key(z) < key(y) thenleft(y) = z

elseright(y) = z

fifi

parent(new node) OK but update left or right child of parent!

Page 15: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 15

DeletionAgain we change the tree but we must keep the binary search tree property.

tree_delete(T,z):if is_leaf(z) then

remove(z)else if has_1child(z) then

splice_out(z)else if has_2children(z) then

y = tree_successor(T,z)remove(y)key(z) = key(y)

fi

Book:Optimized version,don’t panic!

and copy dataO(height)

Page 16: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 16

“Optimized”Deletion

tree_delete(T,z):if left(z) == NIL or

right(z) == NIL theny = z

elsey = tree_successor(z)

fiif left(y) ≠ NIL then

x = left(y)else

x = right(y)fi

if x ≠ NIL thenparent(x) = parent(y)

fiif (parent(y) == NIL then

root(T) = xelse

if y == left(parent(y)) thenleft(parent(y)) = x

elseright(parent(y)) = x

fifiif y ≠ z then

key(z) = key(y)fireturn y

z

last node?

update “right”child of parent(y):y is removed

y == z

x=NIL

(a)

Page 17: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 17

“Optimized”Deletion

tree_delete(T,z):if left(z) == NIL or

right(z) == NIL theny = z

elsey = tree_successor(z)

fiif left(y) ≠ NIL then

x = left(y)else

x = right(y)fi

if x ≠ NIL thenparent(x) = parent(y)

fiif (parent(y) == NIL then

root(T) = xelse

if y == left(parent(y)) thenleft(parent(y)) = x

elseright(parent(y)) = x

fifiif y ≠ z then

key(z) = key(y)fireturn y

z

may splice-out y

last node?

update “right”child of parent(y):y is removed

y == z

x=child(z)

(b)

Page 18: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 18

“Optimized”Deletion

tree_delete(T,z):if left(z) == NIL or

right(z) == NIL theny = z

elsey = tree_successor(z)

fiif left(y) ≠ NIL then

x = left(y)else

x = right(y)fi

if x ≠ NIL thenparent(x) = parent(y)

fiif (parent(y) == NIL then

root(T) = xelse

if y == left(parent(y)) thenleft(parent(y)) = x

elseright(parent(y)) = x

fifiif y ≠ z then

key(z) = key(y)fireturn y

z

z

may splice-out y

last node?

update “right”child of parent(y):y is removed

(c)

Page 19: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 19

Example (a)

15

16

20

18 23

5

3 12

10

6

7

13

z

15

16

20

18 23

5

3 12

10

6

7

13return

Page 20: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 20

Example (b)

15

16

20

18 23

5

3 12

10

6

7

13

z15

20

18 23

5

3 12

10

6

7

13

16return

Page 21: Binary Search Trees - people.cs.aau.dkpeople.cs.aau.dk/.../AA1-06/09-BinarySearchTrees.pdf · Binary tree: Every node in the tree at most 2 children. Support for many operations,

14-11-06 AA1 21

Example (c)

15

16

20

18 23

5

3 12

10

6

7

13

15

16

20

18 23

5

3 12

10

6

7

13

6

6return

z

y