Lec-12

advertisement
CS 253: Algorithms
Chapter 12
Binary Search Trees
Credit: Dr. George Bebis
Binary Search Trees

Tree representation:
◦ A linked data structure in which
each node is an object

◦
◦
◦
◦
◦

L
Node representation:
Key field
Data
Left: pointer to left child
Right: pointer to right child
p: pointer to parent
(p [root [T]] = NIL)
parent
key data
Left child
Satisfies the binary-search-tree
property (see the next slide)
2
R
Right child
Binary Search Tree Property

5
If y is in left subtree of node x,
then key [y] ≤ key [x]
3
2

If y is in right subtree of node x,
then key [y] ≥ key [x]
3
7
4
9
Binary Search Trees

Support many dynamic set operations
◦
◦
◦
◦

SEARCH
INSERT, DELETE
MINIMUM, MAXIMUM
PREDECESSOR, SUCCESSOR
Running time of basic operations on binary search trees
◦ On average: (lgn)
 The expected height of the tree is lgn
◦ In the worst case: (n)
 The tree is a linear chain of n nodes
Worst Case
5
Traversing a Binary Search Tree

Inorder tree walk:
 Root is printed between the values of its left and right subtrees:
 keys are printed in sorted order
left, root, right

Preorder tree walk:
root printed first: root, left, right

Postorder tree walk:
root printed last:
Inorder:
5
3
2
234 5 79
Preorder: 5 3 2 4 7 9
7
4
left, right, root
9
Postorder: 2 4 3 9 7 5
6
Traversing a Binary Search Tree
Alg: INORDER-TREE-WALK(x)
if x  NIL
then INORDER-TREE-WALK ( left [x] )
print key [x]
INORDER-TREE-WALK ( right [x] )
1.
2.
3.
4.
E.g.:
5
3
2

Output: 2 3 4 5 7 9
7
4
9
Running time:
◦
(n), where n is the size of the tree rooted at x
Facts

It is possible to construct a unique Binary Search Tree
given only PREORDER traversal of the BST

It is possible to construct a unique Binary Search Tree
given only POSTORDER traversal of the BST

It is not possible to construct a unique Binary Search Tree
given only INORDER traversal of a BST
However
It is not possible to construct a unique Binary Tree given
only INORDER or only POSTORDER or only PREORDER
traversal of a Binary Tree.
Searching for a Key

Given a pointer to the root of a tree and a key k:
 Return a pointer to a node with key k if one exists
 Otherwise return NIL
5
3
2

7
4
Start at the root; trace down a path
by comparing k with the key of the current node x:

If the keys are equal: we have found the key

If k < key[x] search in the left subtree of x

If k > key[x] search in the right subtree of x
9
Example: TREE-SEARCH
15

6
3
2
Search for key 13:
18
7 17
4
20
15  6  7  13
13
9
10
Searching for a Key
Alg: TREE-SEARCH(x, k)
1.
2.
3.
4.
5.
if x = NIL or k = key [x]
then return x
if k < key [x]
then return TREE-SEARCH(left [x], k )
else return TREE-SEARCH(right [x], k )
5
Running Time:
O (h), h – the height of the tree
3
2
7
4
9
Finding the Minimum in a Binary Search Tree
Goal: find the minimum value in a BST
Following left child pointers from the
root, until a NIL is encountered
15
Alg: TREE-MINIMUM(x)
1.
2.
6
while left [x]  NIL
do x ← left [x]
3
2
18
7 17
4
13
9
3.
return x
Running time
O(h), h – height of tree
Minimum = 2
20
Finding the Maximum in a Binary Search
Tree
Goal: find the maximum value in a BST
Following right child pointers from the
root, until a NIL is encountered
15
Alg: TREE-MAXIMUM(x)
1.
2.
3.
6
while right [x]  NIL
3
do x ← right [x]
2
18
7 17
4
13
9
return x
Maximum = 20
Running time
O(h), h – height of tree
13
20
Successor
Def: successor (x ) = y, such that key [y] is the
smallest key > key [x]
e.g.:
15
successor (15) = 17
successor (13) = 15
successor (9) = 13
successor (20) =?
6
3
2


Case 1: right (x) is non empty
successor (x ) = the minimum in right (x)
Case 2: right (x) is empty
18
7
4
◦ go up the tree until the current node is a left child:
successor (x ) is the parent of the current node
◦ if you cannot go further (and you reached the
root): x is the largest element (no successor!)
17
y
13
9
x
20
Finding the Successor
Alg: TREE-SUCCESSOR(x)
1.
2.
3.
4.
5.
6.
7.
if right [x]  NIL % Case 1
then return TREE-MINIMUM(right [x])
y ← p[x]
% Case 2 - y parent of x
while y  NIL and x == right [y]
do x ← y
y ← p[y]
return y
Running time:
O (h), h – height of the tree
Exercise: if x=20, what does this algorithm return?
15
3
2
y
6
7 17
4
13
9
18
x
20
Predecessor
Def: predecessor (x ) = y such that
key [y] is the biggest key < key [x]
y
e.g.: predecessor (15) = 13
3
2

x
6
predecessor (9) = 7
predecessor (7) = 6

15
7 17
4
Case 1: left (x) is non empty
◦ predecessor (x ) = the maximum in left (x)
Case 2: left (x) is empty
◦ go up the tree until the current node is a right child:
predecessor (x ) is the parent of the current node
◦ if you cannot go further (and you reached the root):
x is the smallest element
13
9
18
20
Insertion
Goal: Insert value v into a binary search tree
Idea:
 If
Insert value 13
key [x] < v move to the right child of x
else move to the left child of x
 When
 If
x == NIL, we found the correct position
5
v<key [y] insert the new node as y’s left child
else insert it as y’s right child

12
2
1
Begining at the root, go down the tree and maintain:
Pointer x : traces the downward path (current node)
Pointer y : parent of x (“trailing pointer” )
18
9 15
3
13
19
17
Example:TREE-INSERT
Insert 13:
12
5
2
1
x=root[T], y=NIL
18
9 15
3
5
19
1
9 15
3
2
1
12
5
2
19
17
x = NIL
y = 15
y
18
9 15
3
19
17
12
5
x
18
2
17
x
y
12
1
18
9 15
3
13
19
17
Alg: TREE-INSERT(T, z)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
y ← NIL
x ← root [T]
while x ≠ NIL
do y ← x
5
if key [z] < key [x]
2
then x ← left [x]
1
3
else x ← right [x]
p[z] ← y
if y = NIL
then root [T] ← z % Tree T was empty
else if key [z] < key [y]
then left [y] ← z
else right [y] ← z
Running time:
O(h)
12
18
9 15
13
19
17
Deletion
Delete a given node z from a binary search tree
Goal:
Case 1: z has no children
Delete z by making the parent of z point to NIL

15
15
5
16
3
5
12
10
13
18
delete
6
7
3
20
z
16
12
23
10
6
20
7
20
18
23
Deletion
Case 2: z has one child

Delete z by making the parent of z point to z’s child, instead of to z
And parent of z becomes the parent of z’s child.
15
z
16
5
3
5
12
10
18
20
3
20
13
15
delete
12
23
10
6
6
7
7
21
18
23
Deletion
Case 3: z has two children




z’s successor (y) is the minimum node in z’s right subtree
y has either no children or one right child (but no left child)
Delete y from the tree (via Case 1 or 2)
Replace z’s key and satellite data with y’s.
6
15
z
5
delete
15
16
3
6
12
10
y
6
3
20
13
18
12
23
10
7
7
16
22
20
13
18
23
TREE-DELETE(T, z)
1.
if left[z] = NIL or right[z] = NIL
2.
then y ← z
3.
else y ← TREE-SUCCESSOR(z) % z has 2 children: Case 3
% z has at most one child: Case 1 or 2
<y will be deleted>
4.
then x ← left[y]
6.
else x ← right[y]
7.
8.
15
if left[y]  NIL
5.
5
y
16
3
x
12
if x  NIL
then p[x] ← p[y]
z
10
6
7
20
13
18
23
TREE-DELETE(T, z) – cont.
<Exercise: check the correctness
of the pointer movements below>
9.
if p[y] = NIL
10.
then root[T] ← x
11.
else if y = left[p[y]]
12.
then left[p[y]] ← x
13.
else right[p[y]] ← x
14.
15.
16.
17.
y
15
5
16
3
12
10
if y  z
x
20
13
18
23
6
then key[z] ← key[y]
7
copy y’s satellite data into z
return y
Running time:
O(h)
due to TREE-SUCCESSOR operation
Binary Search Trees - Summary


Operations on binary search trees:
◦ SEARCH
O(h)
◦ PREDECESSOR
O(h)
◦ SUCCESSOR
O(h)
◦ MINIMUM
O(h)
◦ MAXIMUM
O(h)
◦ INSERT
O(h)
◦ DELETE
O(h)
These operations are fast if the height of the tree is small
Theorem 12.4
The expected height of a randomly built binary search tree
on n distinct keys is O(lgn)
25
Problems

Exercise 12.1-2
What is the difference between the MAX-HEAP
property and the binary search tree property?
Can the min-heap property be used to print out the
keys of an n-node tree in sorted order in O(n) time?
A: No. (sorting can not be done in O(n))
Add’l exercise:
 Can you use the heap property to design an efficient
algorithm that searches for an item in a binary tree?
A: no, it will be very inefficient! (why?)
26
Problems
Let x be the root node of a binary search tree (BST). Write
an algorithm BSTHeight(x) that determines the height of
the tree. What would be its running time?
Alg: BSTHeight(x)
if (x==NULL) return -1;
else
return max(BSTHeight(left[x]), BSTHeight(right[x]))+1;
This program should not take more than O(n) time. Why?
Problems

In a binary search tree, are the insert and delete operations commutative?

Insert:
◦ Start with only 10 in a BST and try to insert 4 followed by 6
Then change the order of insertions and try again

Delete
◦ Delete 5 followed by 6 in the following tree
◦ Then
Delete 6 followed by 5
4
4
2
2
6
5
8
7
4
8
7
2
7
8
Download