Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSE 326 Binary Search Trees David Kaplan Dept of Computer Science & Engineering Autumn 2001.

Similar presentations


Presentation on theme: "CSE 326 Binary Search Trees David Kaplan Dept of Computer Science & Engineering Autumn 2001."— Presentation transcript:

1 CSE 326 Binary Search Trees David Kaplan Dept of Computer Science & Engineering Autumn 2001

2 Binary Search TreesCSE 326 Autumn 20012 Binary Trees Binary tree is  a root  left subtree (maybe empty)  right subtree (maybe empty) Properties  max # of leaves:  max # of nodes:  average depth for N nodes: Representation: A B DE C F HG JI Data right pointer left pointer

3 Binary Search TreesCSE 326 Autumn 20013 Binary Tree Representation A right child left child A B DE C F B right child left child C right child left child D right child left child E right child left child F right child left child

4 Binary Search TreesCSE 326 Autumn 20014 Dictionary ADT Dictionary operations  create  destroy  insert  find  delete Stores values associated with user- specified keys  values may be any (homogeneous) type  keys may be any (homogeneous) comparable type Adrien Roller-blade demon Hannah C++ guru Dave Older than dirt … insert find(Adrien) Adrien Roller-blade demon Donald l33t haxtor

5 Binary Search TreesCSE 326 Autumn 20015 Dictionary ADT: Used Everywhere  Arrays  Sets  Dictionaries  Router tables  Page tables  Symbol tables  C++ structures  … Anywhere we need to find things fast based on a key

6 Binary Search TreesCSE 326 Autumn 20016 Search ADT Dictionary operations  create  destroy  insert  find  delete Stores only the keys  keys may be any (homogenous) comparable  quickly tests for membership Simplified dictionary, useful for examples (e.g. CSE 326) Adrien Hannah Dave … insert find(Adrien) Adrien Donald

7 Binary Search TreesCSE 326 Autumn 20017 Dictionary Data Structure: Requirements  Fast insertion  runtime:  Fast searching  runtime:  Fast deletion  runtime:

8 Binary Search TreesCSE 326 Autumn 20018 Naïve Implementations unsorted array sorted array linked list insertO(n)find + O(n)O(1) findO(n)O(log n)O(n) deletefind + O(1) (mark-as-deleted) find + O(1) (mark-as-deleted) find + O(1)

9 Binary Search TreesCSE 326 Autumn 20019 Binary Search Tree Dictionary Data Structure 4 121062 115 8 14 13 79 Binary tree property  each node has  2 children  result:  storage is small  operations are simple  average depth is small Search tree property  all keys in left subtree smaller than root’s key  all keys in right subtree larger than root’s key  result:  easy to find any given key  Insert/delete by changing links

10 Binary Search TreesCSE 326 Autumn 200110 Example and Counter-Example 3 1171 84 5 4 181062 115 8 20 21 BINARY SEARCH TREE NOT A BINARY SEARCH TREE 7 15

11 Binary Search TreesCSE 326 Autumn 200111 Complete Binary Search Tree Complete binary search tree (aka binary heap):  Links are completely filled, except possibly bottom level, which is filled left-to-right. 7 1793 155 8 146

12 Binary Search TreesCSE 326 Autumn 200112 In-Order Traversal visit left subtree visit node visit right subtree What does this guarantee with a BST? 2092 155 10 307 17 In order listing: 2  5  7  9  10  15  17  20  30

13 Binary Search TreesCSE 326 Autumn 200113 Recursive Find Node * find(Comparable key, Node * t) { if (t == NULL) return t; else if (key key) return find(key, t->left); else if (key > t->key) return find(key, t->right); else return t; } 2092 155 10 307 17 Runtime: Best-worse case? Worst-worse case? f(depth)?

14 Binary Search TreesCSE 326 Autumn 200114 Iterative Find Node * find(Comparable key, Node * t) { while (t != NULL && t->key != key) { if (key key) t = t->left; else t = t->right; } return t; } 2092 155 10 307 17

15 Binary Search TreesCSE 326 Autumn 200115 Insert void insert(Comparable x, Node * t) { if ( t == NULL ) { t = new Node(x); } else if (x key) { insert( x, t->left ); } else if (x > t->key) { insert( x, t->right ); } else { // duplicate // handling is app-dependent } Concept:  Proceed down tree as in Find  If new key not found, then insert a new node at last spot traversed

16 Binary Search TreesCSE 326 Autumn 200116 BuildTree for BSTs  Suppose the data 1, 2, 3, 4, 5, 6, 7, 8, 9 is inserted into an initially empty BST:  in order  in reverse order  median first, then left median, right median, etc.

17 Binary Search TreesCSE 326 Autumn 200117 Analysis of BuildTree Worst case is O(n 2 ) 1 + 2 + 3 + … + n = O(n 2 ) Average case assuming all orderings equally likely: O(n log n)  averaging over all insert sequences (not over all binary trees)  equivalently: average depth of a node is log n  proof: see Introduction to Algorithms, Cormen, Leiserson, & Rivest

18 Binary Search TreesCSE 326 Autumn 200118 BST Bonus: FindMin, FindMax  Find minimum  Find maximum 2092 155 10 307 17

19 Binary Search TreesCSE 326 Autumn 200119 Successor Node Next larger node in this node’s subtree 209 2 155 10 307 17 How many children can the successor of a node have? Node * succ(Node * t) { if (t->right == NULL) return NULL; else return min(t->right); }

20 Binary Search TreesCSE 326 Autumn 200120 Predecessor Node 2092 155 10 307 17 Next smaller node in this node’s subtree Node * pred(Node * t) { if (t->left == NULL) return NULL; else return max(t->left); }

21 Binary Search TreesCSE 326 Autumn 200121 Deletion 2092 155 10 307 17 Why might deletion be harder than insertion?

22 Binary Search TreesCSE 326 Autumn 200122 Lazy Deletion Instead of physically deleting nodes, just mark them as deleted + simpler + physical deletions done in batches + some adds just flip deleted flag - extra memory for deleted flag - many lazy deletions slow finds - some operations may have to be modified (e.g., min and max) 209 2 155 10 307 17

23 Binary Search TreesCSE 326 Autumn 200123 Lazy Deletion 2092 155 10 307 17 Delete(17) Delete(15) Delete(5) Find(9) Find(16) Insert(5) Find(17)

24 Binary Search TreesCSE 326 Autumn 200124 Deletion - Leaf Case 2092 155 10 307 17 Delete(17)

25 Binary Search TreesCSE 326 Autumn 200125 Deletion - One Child Case 2092 155 10 307 Delete(15)

26 Binary Search TreesCSE 326 Autumn 200126 Deletion - Two Child Case 3092 205 10 7 Delete(5) Replace node with descendant whose value is guaranteed to be between left and right subtrees: the successor Could we have used predecessor instead?

27 Binary Search TreesCSE 326 Autumn 200127 Delete Code void delete(Comparable key, Node *& root) { Node *& handle(find(key, root)); Node * toDelete = handle; if (handle != NULL) { if (handle->left == NULL) { // Leaf or one child handle = handle->right; delete toDelete; } else if (handle->right == NULL) { // One child handle = handle->left; delete toDelete; } else { // Two children successor = succ(root); handle->data = successor->data; delete(successor->data, handle->right); }

28 Binary Search TreesCSE 326 Autumn 200128 Thinking about Binary Search Trees Observations  Each operation views two new elements at a time  Elements (even siblings) may be scattered in memory  Binary search trees are fast if they’re shallow Realities  For large data sets, disk accesses dominate runtime  Some deep and some shallow BSTs exist for any data

29 Binary Search TreesCSE 326 Autumn 200129 Beauty is Only  (log n) Deep Binary Search Trees are fast if they’re shallow:  perfectly complete  complete – possibly missing some “fringe” (leaves)  any other good cases? What matters?  Problems occur when one branch is much longer than another  i.e. when tree is out of balance

30 Binary Search TreesCSE 326 Autumn 200130 Dictionary Implementations BST’s looking good for shallow trees, i.e. if Depth is small (log n); otherwise as bad as a linked list! unsorted array sorted array linked list BST insertO(n)find + O(n)O(1)O(Depth) findO(n)O(log n)O(n)O(Depth) deletefind + O(1) (mark-as-deleted) find + O(1) (mark-as-deleted) find + O(1)O(Depth)

31 Binary Search TreesCSE 326 Autumn 200131 Digression: Tail Recursion  Tail recursion: when the tail (final operation) of a function recursively calls the function  Why is tail recursion especially bad with a linked list?  Why might it be a lot better with a tree? Why might it not?

32 Binary Search TreesCSE 326 Autumn 200132 Making Trees Efficient: Possible Solutions Keep BSTs shallow by maintaining “balance”  AVL trees … also exploit most-recently-used (mru) info  Splay trees Reduce disk access by increasing branching factor  B-trees


Download ppt "CSE 326 Binary Search Trees David Kaplan Dept of Computer Science & Engineering Autumn 2001."

Similar presentations


Ads by Google