Transcript
Page 1: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

1

Binary Search Trees (BSTs)

• What is a Binary search tree?

• Why Binary search trees?

• Binary search tree implementation

• Insertion in a BST

• Deletion from a BST

• TreeSort

• BSTs as Priority Queues

Page 2: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

2

Binary Search Tree (Definition)• A binary search tree (BST) is a binary tree that is empty or that

satisfies the BST ordering property:1. The key of each node is greater than each key in the left

subtree, if any, of the node.2. The key of each node is less than each key in the right subtree,

if any, of the node.• Thus, each key in a BST is unique.• Examples: 6

82

41 7 9

53

AA

B

C

D

Note: The literature contains three other definitions for BST that allow duplicate keys in a BST. For any node x:

• key[leftSubtree(x)] key[x] < key[rightSubtree(x)]

• key[leftSubtree(x)] < key[x] key[rightSubtree(x)]

• key[leftSubtree(x)] key[x] key[rightSubtree(x)]

We will not use any of these definitions in this course.

Page 3: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

3

Binary Search Tree (Definition) (Contd.)• A common misunderstanding is that the BST ordering property is only between

parents and children, rather than all the values in left and right subtrees. It is a common error to interpret the BST ordering property as:1. The key of each node is greater than the key of the left child of that node,

if any.2. The key of each node is less than the key of the right child of that node, if

any

• Example:

20

4010

225 30 45

2512

The above is not a BST because both 22 and 25 cannot be on the left subtree of 20; however each node satisfies the BST property with respect to its two children.

Page 4: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

4

Why BSTs?

Data StructureRetrieval or

SearchInsertionDeletionTraversal

BSTO(log n) O(log n)

O(log n)O(n)

Sorted ArrayO(log n)

(using Binary Search)

O(n)O(n)O(n)

Unsorted ArrayO(n)O(1)O(n)O(n)

Sorted Linked ListO(n)O(n)O(n)O(n)

LinkedListO(n)O(1)O(n)O(n)

1. BSTs provide good logarithmic time performance in the best and average cases.

• Average case complexities of using linear data structures compared to BSTs:

Note: BST worst execution time for each of the above operations is O(n) when the tree is linear

Page 5: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

5

Why BSTs? (Contd.)

2 .Binary Search Trees (BSTs) are an important data structure for dynamic sets and Dictionaries:

Each element is an Association object having a Comparable key and an Object value

Dynamic sets support queries such as: Search(x), Minimum(), Maximum(), Successor(x), Predecessor(x)

They also support modifying operations like: Insert(x) and Delete(x)

3 .BSTs can be used to implement priority queues

4 .BSTs are used in TreeSort

Page 6: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

6

Binary Search Tree Implementation

• The BinarySearchTree class inherits the instance variables key, left, and right of the BinaryTree class:

public class BinarySearchTree extends BinaryTree implements SearchableContainer {

private BinarySearchTree getLeftBST(){ return (BinarySearchTree) getLeft( ) ; }

private BinarySearchTree getRightBST( ){ return (BinarySearchTree) getRight( ) ; }// . . .

}

Page 7: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

7

Binary Search Tree Implementation: find

The recursive find method of the BinarySearchTree class:

public Comparable find(Comparable target) { if(isEmpty()) return null; Comparable currentKey = (Comparable) key; int comparison = target.compareTo(currentKey); if(comparison == 0) return currentKey; else if(comparison < 0) return getLeftBST().find(target); else return getRightBST().find(target); }

Page 8: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

8

Binary Search Tree Implementation: findIterative

The iterative find method of the BinarySearchTree class:

public Comparable findIterative(Comparable target){ if(isEmpty()) return null; BinarySearchTree tree = this; while(!tree.isEmpty()){ Comparable currentKey = (Comparable) key; int comparison = currentKey.compareTo(target); if(comparison == 0) return currentKey; else if(comparison < 0) tree = tree.getLeftBST(); else tree = tree.getRightBST(); }

return null; }

Page 9: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

9

Binary Search Tree Implementation: findMin

• The findMin method of the BinarySearchTree class:• By the BST ordering property, the minimum key is the key of the

left-most node that has an empty left-subtree.

public Comparable findMin() { if(isEmpty()) return null; if(getLeftBST().isEmpty()) return (Comparable)getKey(); else return getLeftBST().findMin(); }

Exercise: Write the iterative findMin

20

3010

154 25 40

35

32

7

9

Page 10: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

10

Binary Search Tree Implementation: findMax

• The findMax method of the BinarySearchTree class:• By the BST ordering property, the maximum key is the key of the

right-most node that has an empty right-subtree.

20

3010

154 25 40

35

32

7

9

public Comparable findMax() { if(isEmpty()) return null; if(getRightBST().isEmpty()) return (Comparable)getKey(); else return getRightBST().findMax();}

Exercise: Write the iterative findMax

Page 11: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

11

Binary Search Tree Implementation: findSuccessor

• The successor of a key x is the smallest key greater than x.• If(x has a non-empty right subtree)

Successor of x is the minimum value in the right subtree of x

else{

if(x is maximum value in tree)

x has no successor

else

successor is smallest ancestor of x that is greater than x

}

20

3010

154 25 40

35

32

7

9

keysuccessor

47

910

1520

3032

3540

40No successor

Example:

Page 12: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

12

Binary Search Tree Implementation: findSuccessor (Contd.)public Comparable findSuccessor(Comparable x){

if(isEmpty()) throw new IllegalArgumentException("Tree is empty");

else return findSuccessor(x, (Comparable)getKey());

}

private Comparable findSuccessor(Comparable x, Comparable successor){

if(isEmpty()) throw new IllegalArgumentException(x + " is not in tree");

Comparable currentKey = (Comparable)getKey();

int comparison = x.compareTo(currentKey);

if(comparison == 0){

if(!getRightBST().isEmpty()) return getRightBST().findMin();

else if(getRightBST().isEmpty() && successor.compareTo(x) < 0) // x is max value in tree

throw new IllegalArgumentException(x + " has no successor");

else return successor;

}

else if(comparison < 0)

return getLeftBST().findSuccessor(x, currentKey);

else

return getRightBST().findSuccessor(x, successor);

}

Page 13: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

13

Binary Search Tree Implementation: findPredecessor

• The predecessor of a key x is the largest key smaller than x.• If(x has a non-empty left subtree)

predecessor of x is the maximum value in the left subtree of xelse{ if(x is minimum value in tree) x has no predecessor else predecessor is the last ancestor of x that is smaller than x (on the path from root to the node x)}

20

3010

154 25 40

35

32

7

9

keypredecessor

4No predecessor

97

1510

3230

3532

4035

Example:

Page 14: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

14

Binary Search Tree Implementation: findPredecesor (Contd.)public Comparable findPredecessor(Comparable x){

if(isEmpty()) throw new IllegalArgumentException("Tree is empty");

else if(x.equals(getKey()) && getLeftBST().isEmpty())

throw new IllegalArgumentException(x + " has no predecessor");

else return findPredecessor(x, (Comparable)getKey());

}

private Comparable findPredecessor(Comparable x, Comparable predecessor){

if(isEmpty()) throw new IllegalArgumentException(x + " is not in tree");

Comparable currentKey = (Comparable)getKey();

int comparison = x.compareTo(currentKey);

if(comparison == 0){

if(!getLeftBST().isEmpty()) return getLeftBST().findMax();

else if(getLeftBST().isEmpty() && predecessor.compareTo(x) > 0) // x is min value in tree

throw new IllegalArgumentException(x + " has no predecessor");

else return predecessor;

}

else if(comparison > 0) return getRightBST().findPredecessor(x, currentKey);

else return getLeftBST().findPredecessor(x, predecessor);

}

Page 15: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

15

Insertion in a BST

• By the BST ordering property, a new node is always inserted as a leaf node.

• The insert method, given in the next page, recursively finds an appropriate empty subtree to insert the new key. It then transforms this empty subtree into a leaf node by invoking the attachKey method:

public void attachKey(Object obj) { if(!isEmpty()) throw new InvalidOperationException(); else { key = obj; left = new BinarySearchTree(); right = new BinarySearchTree(); } }

Page 16: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

16

Insertion in a BST (Contd.)

1

6

82

4 7 9

3

5 6

82

4 7 9

3

5

6

82

4 7 9

3

5

6

82

4 7 9

3 5

1 1 1

public void insert(Comparable comparable){ if(isEmpty()) attachKey(comparable); else { Comparable key = (Comparable) getKey(); if(comparable.compareTo(key)==0) throw new IllegalArgumentException("duplicate key"); else if (comparable.compareTo(key)<0) getLeftBST().insert(comparable); else getRightBST().insert(comparable); }}

Page 17: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

17

Deletion in a BST

• There are three cases:

1. The node to be deleted is a leaf node.

2. The node to be deleted has one non-empty child.

3. The node to be deleted has two non-empty children.

Page 18: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

18

CASE 1: Deleting a Leaf Node

Convert the leaf node into an empty tree by using the detachKey method:

// In Binary Tree class public Object detachKey( ){ if(! isLeaf( )) throw new InvalidOperationException( ) ; else { Object obj = key ; key = null ; left = null ; right = null ; return obj ; } }

• Example: 7

152

41 8 40

63 9

5

Delete 5

Page 19: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

19

CASE 2: Deleting a one-child node

• CASE 2: THE NODE TO BE DELETED HAS ONE NON-EMPTY CHILD(a) The right subtree of the node x to be deleted is empty.

• Example:

20

355

83 22 40

25

Delete 1020

3510

8

5 22 40

3 25

6

target

temp

6

target

// Let target be a reference to the node x.BinarySearchTree temp = target.getLeftBST();target.key = temp.key;target.left = temp.left;target.right = temp.right;temp = null;

Page 20: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

20

CASE 2: Deleting a one-child node (Cont’d)

(b) The left subtree of the node x to be deleted is empty.

Example:

Delete 8

7

152

41 8 40

63 12

5

target

temp

149

7

152

41 12 40

63

5

target

149

// Let target be a reference to the node x.BinarySearchTree temp = target.getRightBST();target.key = temp.key;target.left = temp.left;target.right = temp.right;temp = null;

Page 21: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

21

CASE 3: DELETING A NODE THAT HAS TWO NON-EMPTY CHILDREN

DELETION BY COPYING: METHOD#1

Copy the minimum key in the right subtree of x to the node x, then delete the one-child or leaf-node with this minimum key.

• Example:

7

152

41 8 40

63 9

5

Delete 7 8

152

41 9 40

63

5

Page 22: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

22

CASE 3: DELETING A NODE THAT HAS TWO NON-EMPTY CHILDREN (Contd.)

DELETION BY COPYING: METHOD#2

Copy the maximum key in the left subtree of x to the node x, then delete the one-child or leaf-node with this maximum key.

• Example:

7

152

41 8 40

63 9

5

Delete 7 6

152

41 8 40

53 9

Page 23: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

23

Deletion by Copying: Method#1 implementation

// find the minimum key in the right subtree of the target nodeComparable min = target.getRightBST().findMin();

// copy the minimum value to the targettarget.key = min; // delete the one-child or leaf node having the mintarget.getRightBST().withdraw(min);

Note: All the different cases for deleting a node are handled in the withdraw (Comparable key) method of BinarySearchTree class

Page 24: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

24

Tree Sort

Any of the following in-order traversal behaviour of BST can be used to implement a sorting algorithm on an array of distinct elements:

• The in-order traversal of a BST visits the nodes of the tree in increasing sorted order• The reverse in-order traversal of a BST visits the nodes in decreasing sorted order

This algorithm is called TreeSort.

20

3010

154 25 40

35

32

7

9 In-order Traversal: 4, 7, 9, 10, 15, 20, 25, 30, 32, 35, 40

Reverse in-order Traversal: 40, 35, 32, 30, 25, 20, 15, 10, 9, 7, 4

Example:

Page 25: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

25

Tree Sort (Contd.)

public static void treeSort(int[] x){ BinarySearchTree tree = buildBST(x); if(tree == null) throw new IllegalArgumentException("Error: Duplicate keys"); else{ int[] index = {0}; // need to pass index by reference tree.treeSort(x, index); } } private void treeSort(int[] x, int[] index){ if(isEmpty()) return; else{ getLeftBST().treeSort(x, index); int k = index[0]; x[k] = (Integer) getKey(); index[0] = k + 1; getRightBST().treeSort(x, index); }}

TreeSort algorithm:• Insert the array elements in a BST• Perform an in-order traversal on the BST, storing each visited value in the corresponding array location

Page 26: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

26

Tree Sort (Contd.)

private static BinarySearchTree buildBST(int[ ] x){ // x must have distinct values BinarySearchTree tree = new BinarySearchTree( ); for(int k = 0; k < x.length; k++){ try{ tree.insert(new Integer(x[k])); } catch(IllegalArgumentException e){ tree = null; } } return tree; }

Page 27: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

27

Tree Sort (Contd.)

public static void treeSort(int[ ] x){ BinarySearchTree tree = buildBST(x); if(tree == null) throw new IllegalArgumentException("Error: Duplicate keys"); else{ for(int k = 0; k < x.length; k++){ Comparable min = tree.findMin(); x[k] = (Integer) min; tree.withdraw(min); } } }

An alternative TreeSort algorithm is:• Insert the array elements in a BST• for(int k = 0; k < array.length; k++) array[k] = bst.Min(); bst.exractMin(); }

Page 28: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

28

Tree Sort (Contd.)

Adding items to a binary search tree is on average an O(log n) process, so adding n items is an O(n log n) process.

But adding an item to an unbalanced binary tree needs O(n) time in the worst-case, when the tree resembles a linked list (degenerate tree), causing a worst case of O(n2) for this sorting algorithm.

The worst case scenario happens when Tree Sort algorithm sorts an already sorted array. This would make the time needed to insert all elements into the binary tree O(n2).

The worst-case behaviour can be improved upon by using a Self-balancing binary search tree such as AVL tree. Using such a tree, the algorithm has an O(n log n) worst-case performance.

Page 29: 1 Binary Search Trees (BSTs) What is a Binary search tree? Why Binary search trees? Binary search tree implementation Insertion in a BST Deletion from

29

BSTs as Priority Queues

By using insert and withdrawMax or WithdrawMin a BST can be used as a priority queue in which the keys of the elements are distinct.


Recommended