CMSC 341 Lecture 10 Binary Search Trees

Similar documents
CMSC 341. Binary Search Trees CMSC 341 BST

Data Structures. Giri Narasimhan Office: ECS 254A Phone: x-3748

! Tree: set of nodes and directed edges. ! Parent: source node of directed edge. ! Child: terminal node of directed edge

! Tree: set of nodes and directed edges. ! Parent: source node of directed edge. ! Child: terminal node of directed edge

Tree: non-recursive definition. Trees, Binary Search Trees, and Heaps. Tree: recursive definition. Tree: example.

Trees, Binary Trees, and Binary Search Trees

Binary Trees, Binary Search Trees

4. Trees. 4.1 Preliminaries. 4.2 Binary trees. 4.3 Binary search trees. 4.4 AVL trees. 4.5 Splay trees. 4.6 B-trees. 4. Trees

Data Structures in Java

Trees. (Trees) Data Structures and Programming Spring / 28

CMSC 341 Leftist Heaps

CMSC 341 Lecture 15 Leftist Heaps

CMSC 341 Lecture 15 Leftist Heaps

CIS 121. Binary Search Trees

Discussion 2C Notes (Week 8, February 25) TA: Brian Choi Section Webpage:

CS350: Data Structures Binary Search Trees

Chapter 20: Binary Trees

Outline. Preliminaries. Binary Trees Binary Search Trees. What is Tree? Implementation of Trees using C++ Tree traversals and applications

* Due 11:59pm on Sunday 10/4 for Monday lab and Tuesday 10/6 Wednesday Lab

CS 350 : Data Structures Binary Search Trees

CMSC 341 Lecture 14: Priority Queues, Heaps

Binary Search Trees. See Section 11.1 of the text.

Lec 17 April 8. Topics: binary Trees expression trees. (Chapter 5 of text)

Review: Trees Binary Search Trees Sets in Java Collections API CS1102S: Data Structures and Algorithms 05 A: Trees II

Trees, Part 1: Unbalanced Trees

INF2220: algorithms and data structures Series 1

void insert( Type const & ) void push_front( Type const & )

CS211, LECTURE 20 SEARCH TREES ANNOUNCEMENTS:

CmpSci 187: Programming with Data Structures Spring 2015

a graph is a data structure made up of nodes in graph theory the links are normally called edges

Programming II (CS300)

Figure 18.4 A Unix directory. 02/10/04 Lecture 9 1

Name CPTR246 Spring '17 (100 total points) Exam 3

Generic BST Interface

CMSC 341 Priority Queues & Heaps. Based on slides from previous iterations of this course

SCJ2013 Data Structure & Algorithms. Binary Search Tree. Nor Bahiah Hj Ahmad

9/29/2016. Chapter 4 Trees. Introduction. Terminology. Terminology. Terminology. Terminology

Friday Four Square! 4:15PM, Outside Gates

COMP : Trees. COMP20012 Trees 219

Trees. Dr. Ronaldo Menezes Hugo Serrano Ronaldo Menezes, Florida Tech

CMPSCI 187: Programming With Data Structures. Lecture #26: Binary Search Trees David Mix Barrington 9 November 2012

Priority Queues. 1 Introduction. 2 Naïve Implementations. CSci 335 Software Design and Analysis III Chapter 6 Priority Queues. Prof.

Binary Search Trees Part Two

Cpt S 122 Data Structures. Data Structures Trees

Garbage Collection: recycling unused memory

CMPSCI 187: Programming With Data Structures. Lecture #28: Binary Search Trees 21 November 2011

Binary Trees. BSTs. For example: Jargon: Data Structures & Algorithms. root node. level: internal node. edge.

Part I: Short Answer (12 questions, 65 points total)

CS 151. Binary Search Trees. Wednesday, October 10, 12

Why Do We Need Trees?

Data Structures and Algorithms

Introduction. for large input, even access time may be prohibitive we need data structures that exhibit times closer to O(log N) binary search tree

Course Review for. Cpt S 223 Fall Cpt S 223. School of EECS, WSU

Tree Travsersals and BST Iterators

Binary Trees and Binary Search Trees

Advanced Java Concepts Unit 5: Trees. Notes and Exercises

Cpt S 122 Data Structures. Course Review Midterm Exam # 1

CS102 Binary Search Trees

Priority Queues. 04/10/03 Lecture 22 1

Multiple choice questions. Answer on Scantron Form. 4 points each (100 points) Which is NOT a reasonable conclusion to this sentence:

CMSC 341 Lecture 7 Lists

Chapter 5. Binary Trees

TREES. Trees - Introduction

Suppose that the following is from a correct C++ program:

Priority Queues (Heaps)

Binary Search Trees Treesort

Motivation Computer Information Systems Storage Retrieval Updates. Binary Search Trees. OrderedStructures. Binary Search Tree

CE 221 Data Structures and Algorithms

CS302 - Data Structures using C++

Trees. R. J. Renka 10/14/2011. Department of Computer Science & Engineering University of North Texas. R. J. Renka Trees

Section 1: True / False (2 points each, 30 pts total)

Binary Tree Implementation

Exam Data structures DAT036/DAT037/DIT960

Lecture 2. Binary Trees & Implementations. Yusuf Pisan

Trees 2: Linked Representation, Tree Traversal, and Binary Search Trees

MULTIMEDIA COLLEGE JALAN GURNEY KIRI KUALA LUMPUR

Announcements. Midterm exam 2, Thursday, May 18. Today s topic: Binary trees (Ch. 8) Next topic: Priority queues and heaps. Break around 11:45am

COSC 2007 Data Structures II Final Exam. Part 1: multiple choice (1 mark each, total 30 marks, circle the correct answer)

CISC 235 Topic 3. General Trees, Binary Trees, Binary Search Trees

1 Binary trees. 1 Binary search trees. 1 Traversal. 1 Insertion. 1 An empty structure is an empty tree.

CSE 143. Linked Lists. Linked Lists. Manipulating Nodes (1) Creating Nodes. Manipulating Nodes (3) Manipulating Nodes (2) CSE 143 1

B-Trees. nodes with many children a type node a class for B-trees. an elaborate example the insertion algorithm removing elements

Binary Trees

CSCI2100B Data Structures Trees

The Binary Search Tree ADT

CS302 - Data Structures using C++

l Determine if a number is odd or even l Determine if a number/character is in a range - 1 to 10 (inclusive) - between a and z (inclusive)

CMSC 341 Lecture 6 Templates, Stacks & Queues. Based on slides by Shawn Lupoli & Katherine Gibson at UMBC

BINARY SEARCH TREES cs2420 Introduction to Algorithms and Data Structures Spring 2015

Unit III - Tree TREES

Hierarchical data structures. Announcements. Motivation for trees. Tree overview

Tree Structures. Definitions: o A tree is a connected acyclic graph. o A disconnected acyclic graph is called a forest

CSE 373 Spring Midterm. Friday April 21st

Hash Tables. CS 311 Data Structures and Algorithms Lecture Slides. Wednesday, April 22, Glenn G. Chappell

Data Structures. Giri Narasimhan Office: ECS 254A Phone: x-3748

Heaps. A complete binary tree can be easily stored in an array - place the root in position 1 (for convenience)

A set of nodes (or vertices) with a single starting point

Trees 2: Linked Representation, Tree Traversal, and Binary Search Trees

Trees. Chapter 6. strings. 3 Both position and Enumerator are similar in concept to C++ iterators, although the details are quite different.

Data Structures and Algorithms for Engineers

Transcription:

CMSC 341 Lecture 10 Binary Search Trees John Park Based on slides from previous iterations of this course

Review: Tree Traversals 2

Traversal Preorder, Inorder, Postorder H X M A K B E N Y L G W UMBC CMSC 341 Binary Search Trees 3

Preorder Traversal 1 H Display the current node s value Traverse the left subtree (may be NULL) Traverse the right subtree (may be NULL) LEFT, NODE, RIGHT 2 X 7 M 3 A 6 K 8 B 10 E N 4 5 Y 9 L G 11 12 W UMBC CMSC 341 Binary Search Trees 4

Inorder Traversal X 4 H 6 Traverse the left subtree (may be NULL) Display the current node s value Traverse the right subtree (may be NULL) NODE, LEFT, RIGHT M 9 A 2 K 5 B 8 E 11 N Y 1 3 L 7 G W 10 12 UMBC CMSC 341 Binary Search Trees 5

Postorder Traversal H 12 Traverse the left subtree (may be NULL) Traverse the right subtree (may be NULL) Display the current node s value LEFT, RIGHT, NODE X 5 M 11 A 3 K 4 B 7 E 10 N 1 Y 2 L 6 G 8 W 9 UMBC CMSC 341 Binary Search Trees 6

Level Order Traversal Requires the use of a Queue 1 H 2 X 3 M 4 A 5 K 6 B 7 E 8 N 9 Y 10 11 12 L G W UMBC CMSC 341 Binary Search Trees 7

Pointers vs References 8

Passing by Value The default way to pass variables to functions // function prototype void PrintVal (int x); int x = 5; int *xptr = &x; PrintVal(x); // function call PrintVal(*xPtr); // also valid call UMBC CMSC 341 Binary Search Trees 9

Passing a Pointer (Reference by Value) Uses pointers (address to the variable) Uses * to dereference, and & to get address void ChangeVal(int *x); //prototype int x = 5; int *xptr = &x; ChangeVal(&x); // function call ChangeVal(xPtr); // also valid call UMBC CMSC 341 Binary Search Trees 10

Passing a Reference Uses references (different from pointers) Allows called function to modify caller s variable void ChangeVal(int &x); //prototype int x = 5; int *xptr = &x; ChangeVal(x); //function call ChangeVal(*xPtr); //also valid call UMBC CMSC 341 Binary Search Trees 11

Passing a Reference Uses references (different from pointers) Allows called function to modify caller s variable void ChangeVal(int &x); //prototype int x = 5; int &xref = x; //create reference ChangeVal(x); //function call ChangeVal(xRef); //also valid call UMBC CMSC 341 Binary Search Trees 12

Pointers vs. References How are references different from pointers? References must be initialized at declaration References cannot be changed References can be treated as another name for a variable No dereferencing to get the value Functions that take values and references have identical definitions UMBC CMSC 341 Binary Search Trees 13

Advantages of Passing by Pointer/Ref Advantages: Allows a function to change the value Doesn t make a copy of the argument (fast!) We can return multiple values Disadvantages: Dereferencing a pointer is slower than direct access to the value. (References are internally implemented via pointers) From: http://www.learncpp.com/cpp-tutorial/74-passing-arguments-by-address UMBC CMSC 341 Binary Search Trees 14

Advantages of References vs. Pointers Reference advantages: Can pass as const to avoid unintentional changes Values don t have to be checked to see if they re NULL Disadvantages: Hard to tell if the function is passing by value or reference without looking at the function itself From: http://www.learncpp.com/cpp-tutorial/74-passing-arguments-by-address UMBC CMSC 341 Binary Search Trees 15

Properties of Binary Search Trees 16

Advantages of a BST Binary Search Trees are sorted as they re made How quickly does linear binary search find a value? O(log n) Binary Search Trees work on the same principle What if the tree isn t perfect? Performance will be better/worse: worst-case O(n) But on average, will be O(log n) UMBC CMSC 341 Binary Search Trees 17

Searching Through a BST Easy to locate an element of the tree Find arbitrary element: Compare to the current node s value If current node is bigger, go left; otherwise, go right Minimum: Go left until it s no longer possible (It may not be a leaf it may have a right subtree) Maximum: Go right until it s no longer possible (It may not be a leaf it may have a left subtree) UMBC CMSC 341 Binary Search Trees 18

Practice: BST of Integers Describe the values that might appear in the subtrees A, B, C, and D UMBC CMSC 341 Binary Search Trees 19

Example: Creating a BST Draw the BST that would result from these values, given in this exact order H,F,A,M,G,Z H F M A G Z UMBC CMSC 341 Binary Search Trees 20

Practice: Creating a BST Draw the BST that would result from these values, given in this exact order 8,2,1,9,6,5,3,7,4 5,9,1,8,2,6,7,3,4 8,1,2,6,9,3,4,7,5 1,2,3,4,5,6,7,8,9 5,3,7,9,6,1,4 Great website where you can practice and learn about BSTs: http://visualgo.net/bst.html UMBC CMSC 341 Binary Search Trees 21

Subtrees and Recursion Every node is the root for its own subtree (Subtree of the actual root is the whole tree) Almost everything we do with trees can be (and should be) coded using recursion For example: traversal of the tree (pre-, in-, and postorder) can be done recursively Which will print out a BST from low to high? UMBC CMSC 341 Binary Search Trees 22

Implementing a Binary Search Tree 23

Representing a Binary Search Tree What data structure would you use for a BST? Array? Stack? Queue???? (Modified) implementation of Linked List Linked List nodes contain two things: Data, and a pointer to the next node BST nodes should contain Data, and two pointers: left and right children UMBC CMSC 341 Binary Search Trees 24

Generic Structure for BST node struct BinaryNode { // Member variables <AnyType> element; // Data in the node BinaryNode *left; // Left child BinaryNode *right; // Right child } // Constructor BinaryNode(const <AnyType> & theelement, BinaryNode *lt, BinaryNode *rt ) { element = theelement; left = lt; right = rt; } UMBC CMSC 341 Binary Search Trees 25

BST Node Functions What other functions might we want for a node? Constructor that just takes in data (no children) Initializes children to NULL automatically print() function May be mostly handled if the data is really simple or another class with a print() function Destructor (again, may already be handled) Getters and setters (mutators/accessors) UMBC CMSC 341 Binary Search Trees 26

Generic Class for BST class BinarySearchTree { public: BinarySearchTree( ) :root( NULL ) { } BinarySearchTree( const BinarySearchTree &rhs ) : root( NULL ) { *this = rhs; } } private: // this private BinaryNode is within BST BinaryNode *root; UMBC CMSC 341 Binary Search Trees 27

Binary Search Tree Operations 28

Basic BST Operations (BST Setup) set up a BST (Node Setup) set up a BST Node void insert(x) insert x into the BST void remove(x) remove x from the BST <type> findmin() find min value in the BST <type> findmax() find max value in the BST boolean contains(x) is x in the BST? boolean isempty() is the BST empty? void makeemtpy() make the BST empty void PrintTree() print the BST UMBC CMSC 341 Binary Search Trees 29

Public and Private Functions Many of the operations we want to use will have two (overloaded) versions Public function takes in zero or one arguments Calls the private function Private function takes in one or two arguments Additional argument is the root of the subtree Private function recursively calls itself Changes the root each time to go further down the tree UMBC CMSC 341 Binary Search Trees 30

Insert void insert( x ) 31

Inserting a Node Insertion will always create a new leaf node In determining what to do, there are 4 choices Insert the node at the current spot The current node is NULL (we ve reached a leaf) Go down the left subtree (visit the left child) Value we want to insert is smaller than current Go down the right subtree (visit the right child) Value we want to insert is greater than current Do nothing (if we ve found a duplicate) UMBC CMSC 341 Binary Search Trees 32

Insert Functions Two versions of insert Public version (one argument) Private version (two arguments, recursive) Public version immediately calls private one void insert( const Comparable & x ) { // calls the overloaded private insert() insert( x, root ); } UMBC CMSC 341 Binary Search Trees 33

Starting at the Root of a (Sub)tree First check if the root of the tree is NULL If it is, create and insert the new node Send left and right children to NULL // overloaded function that allows recursive calls void insert( const Comparable & x, BinaryNode * & t ) { if( t == NULL ) // no node here (make a leaf) t = new BinaryNode( x, NULL, NULL ); // rest of function } UMBC CMSC 341 Binary Search Trees 34

Insert New Node (Left or Right) If the root we have is not NULL Traverse down another level via its children Call insert() with new sub-root (recursive) // value in CURRENT root 't' < new value else if( x < t->element ) { insert( x, t->left ); } // value in CURRENT root 't' > new value else if( t->element < x ) { insert( x, t->right ); } else; // Duplicate; do nothing UMBC CMSC 341 Binary Search Trees 35

Full Insert() Function Remember, this function is recursive! // overloaded function that allows recursive calls void insert( const Comparable & x, BinaryNode * & t ) { if( t == NULL ) // no node here (make a new leaf) t = new BinaryNode( x, NULL, NULL ); // value in CURRENT root 't' < new value else if( x < t->element ) { insert( x, t->left ); } // value in CURRENT root 't' > new value else if( t->element < x ) { insert( x, t->right ); } } else; // Duplicate; do nothing UMBC CMSC 341 Binary Search Trees 36

What s Up With BinaryNode * & t? The code * & t is a reference to a pointer Remember that passing a reference allows us to change the value of a variable in a function And have that change stick outside the function When we pass a variable, we pass its value It just so happens that a pointer s value is the address of something else in memory UMBC CMSC 341 Binary Search Trees 37

Find Minimum Comparable findmin( ) 41

Finding the Minimum What do we do? Go all the way down to the left Comparable findmin(binarynode *t ) { // empty tree if (t == NULL) { return NULL; } } // no further nodes to the left if (t->left == NULL) { return t->value; } else { return findmin(t->left); } UMBC CMSC 341 Binary Search Trees 42

Find Maximum Comparable findmax( ) 43

Finding the Minimum What do we do? Go all the way down to the right Comparable findmax(binarynode *t ) { // empty tree if (t == NULL) { return NULL; } } // no further nodes to the right if (t->right == NULL) { return t->value; } else { return findmax(t->right); } UMBC CMSC 341 Binary Search Trees 44

Recursive Finding of Min/Max Just like insert() and other functions, findmin() and findmax() have 2 versions Public (no arguments): Comparable findmin( ); Comparable findmax( ); Private (one argument): Comparable findmax (BinaryNode *t); Comparable findmax (BinaryNode *t); UMBC CMSC 341 Binary Search Trees 45

Delete the Entire Tree void makeempty ( ) 46

Memory Management Remember, we don t want to lose any memory by freeing things out of order! Nodes to be carefully deleted BST nodes are only deleted when A single node is removed We are finished with the entire tree Call the destructor UMBC CMSC 341 Binary Search Trees 47

Destructor The destructor for the tree simply calls the makeempty() function // destructor for the tree ~BinarySearchTree( ) { // we call a separate function // so that we can use recursion makeempty( root ); } UMBC CMSC 341 Binary Search Trees 48

Make Empty A recursive call will make sure we hang onto each node until its children are deleted void makeempty( BinaryNode * & t ) { if( t!= NULL ) { // delete both children, then t makeempty( t->left ); makeempty( t->right ); delete t; // set t to NULL after deletion t = NULL; } } UMBC CMSC 341 Binary Search Trees 49

Find a Specific Value boolean contains( x ) 50

Finding a Node Only want to know if it s in the tree, not where Use recursion to traverse the tree bool contains( const Comparable & x ) const { return contains( x, root ); } bool contains( const Comparable & x, BinaryNode *t ) const { if( t == NULL ) { return false; } // our value is lower than the current node's else if( x < t->element ) { return contains( x, t->left ); } // our value is higher than the current node's else if( t->element < x ) { return contains( x, t->right );} else { return true; } // Match } UMBC CMSC 341 Binary Search Trees 51

Finding a Node Only want to know if it s in the tree, not where Use recursion to traverse the tree bool contains( const Comparable & x ) const { return contains( x, root ); } bool contains( const Comparable & x, BinaryNode *t ) const { if( t == NULL ) { return We false; have } to have a defined // our value is lower than overloaded the current comparison node's else if( x < t->element ) operator { return for contains( this to work! x, t->left ); } // our value is higher than the current node's else if( t->element < x ) { (Both return of contains( the else x, ift->right statements );} else { return true; } // Match } use < so we only need to write one) UMBC CMSC 341 Binary Search Trees 52

Removing a Node void remove( x ) 54

Complicated Removal Similar to a linked list, removal is often much more complicated than insertion or complete deletion We must first traverse the tree to find the target we want to remove If we disconnect a link, we need to reestablish Possible scenarios No children (leaf) One child Two children UMBC CMSC 341 Binary Search Trees 55

Removing A Node Example 1 Remove 4 Any issues? UMBC CMSC 341 Binary Search Trees 56

Removing A Node Example 2 Remove 6 Any issues? UMBC CMSC 341 Binary Search Trees 57

Removing A Node Example 3 Remove 8 Any issues? UMBC CMSC 341 Binary Search Trees 58

Removing a Node No Children Simplest scenario for removal No children to worry about managing Reminder: nodes with no children are leaves We still have to find the target node first To remove a node with no children, we need to do the following: Cut the link from the parent node Free the memory UMBC CMSC 341 Binary Search Trees 59

Removing a Node One Child Second easiest scenario for removal Only one child is linked to the node The node can only be deleted after its parent adjusts the link to bypass the node to the child The grandparent node takes custody To remove a node with one child, we need to do the following: Connect node s parent to its child (custody) Free the memory UMBC CMSC 341 Binary Search Trees 60

Example Removal One Child Remove 18 from this BST: Grandparent takes custody Source: http://www.algolist.net/data_structures/binary_search_tree/removal UMBC CMSC 341 Binary Search Trees 61

Code for Removal void remove( const Comparable & x, BinaryNode * & t ) { // code to handle two children prior to this else { // "hold" the position of node we'll delete BinaryNode *oldnode = t; } } // ternary operator t = ( t->left!= NULL )? t->left : t->right; delete oldnode; UMBC CMSC 341 Binary Search Trees 62

Removing a Node Two Children Most difficult scenario for removal Everyone in the subtree will be affected Instead of completely deleting the node, we will replace its value with another node s The smallest value in the right subtree Use findmin() to locate this value Then delete the node whose value we moved Using the minimum of a subtree ensures it does not also have two children to handle UMBC CMSC 341 Binary Search Trees 64

Remove Function void remove( const Comparable & x, BinaryNode * & t ) { if( t == NULL ) { return; } // item not found; do nothing // continue to traverse until we find the element if( x < t->element ) { remove( x, t->left ); } else if( t->element < x ) { remove( x, t->right ); } else if( t->left!= NULL && t->right!= NULL ) // two children { // find right s lowest value t->element = findmin( t->right )->element; // now delete that found value remove( t->element, t->right ); } else // zero or one child { BinaryNode *oldnode = t; // ternary operator t = ( t->left!= NULL )? t->left : t->right; delete oldnode; } } UMBC CMSC 341 Binary Search Trees 65

Printing a Tree void printtree( ) 66

Printing a Tree Printing is simple only question is which order we want to traverse the tree in? // ostream &out is the stream we want to print to // (it maybe cout, it may be a file our choice) void printtree( BinaryNode *t, ostream & out ) const { // if the node isn't null if( t!= NULL ) { // print an in-order traversal printtree( t->left, out ); out << t->element << endl; printtree( t->right, out ); } } UMBC CMSC 341 Binary Search Trees 67

Performance Run Time of BST Operations 68

Big O of BST Operations Operation Big O contains( x ) O(log n) insert( x ) O(log n) remove( x ) O(log n) findmin/findmax( x ) O(log n) isempty( ) O(1) printtree( ) O(n) UMBC CMSC 341 Binary Search Trees 69