CMSC 341. Binary Search Trees CMSC 341 BST

Similar documents
CMSC 341 Lecture 10 Binary Search Trees

CIS 121. Binary Search Trees

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

Data Structures in Java

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

Trees, Binary Trees, and Binary Search Trees

Binary Trees, Binary Search Trees

! 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

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

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

Binary Search Trees. See Section 11.1 of the text.

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

CS350: Data Structures Binary Search Trees

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

CS 350 : Data Structures 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

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

Recursion. Example 1: Fibonacci Numbers 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,

Generic BST Interface

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

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

Trees, Part 1: Unbalanced Trees

Programming II (CS300)

CS350: Data Structures Tree Traversal

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

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

CmpSci 187: Programming with Data Structures Spring 2015

Binary Node. private Object element; private BinaryNode left; private BinaryNode right; 02/18/03 Lecture 12 1

protected BinaryNode root; } 02/17/04 Lecture 11 1

Garbage Collection: recycling unused memory

CS102 Binary Search Trees

Binary Trees and Binary Search Trees

Chapter 20: Binary Trees

Advanced Java Concepts Unit 5: Trees. Notes and Exercises

Lecture 37 Section 9.4. Wed, Apr 22, 2009

TREES. Trees - Introduction

INF2220: algorithms and data structures Series 1

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

CMSC 341 Leftist Heaps

CS211, LECTURE 20 SEARCH TREES ANNOUNCEMENTS:

CE 221 Data Structures and Algorithms

The Binary Search Tree ADT

Search Trees: BSTs and B-Trees

COMP : Trees. COMP20012 Trees 219

Binary search trees. Binary search trees are data structures based on binary trees that support operations on dynamic sets.

Binary search trees 3. Binary search trees. Binary search trees 2. Reading: Cormen et al, Sections 12.1 to 12.3

Binary Tree. Preview. Binary Tree. Binary Tree. Binary Search Tree 10/2/2017. Binary Tree

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

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

Priority Queues. 04/10/03 Lecture 22 1

Second Exam SAMPLE Computer Programming 338 Dr. St. John Lehman College City University of New York Tuesday, 5 April 2011

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

CMSC 341 Lecture 15 Leftist Heaps

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

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

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

CMSC 341 Lecture 15 Leftist Heaps

Computational Optimization ISE 407. Lecture 16. Dr. Ted Ralphs

CS350: Data Structures AA Trees

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

Algorithms in Systems Engineering ISE 172. Lecture 16. Dr. Ted Ralphs

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

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

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

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

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

Binary Trees. Examples:

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

CS302 - Data Structures using C++

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

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

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

Data Structures and Algorithms

from inheritance onwards but no GUI programming expect to see an inheritance question, recursion questions, data structure questions

TREES Lecture 12 CS2110 Fall 2016

Associate Professor Dr. Raed Ibraheem Hamed

TREES Lecture 10 CS2110 Spring2014

TREES. Tree Overview 9/28/16. Prelim 1 tonight! Important Announcements. Tree terminology. Binary trees were in A1!

Exam Data structures DAT036/DAT037/DIT960

Binary search trees (BST) Binary search trees (BST)

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

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

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

TREES Lecture 12 CS2110 Spring 2018

Binary Trees. College of Computing & Information Technology King Abdulaziz University. CPCS-204 Data Structures I

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

Trees. Q: Why study trees? A: Many advance ADTs are implemented using tree-based data structures.

Chapter 5. Binary Trees

Chapter 8. Binary Search Trees. Fall 2013 Yanjun Li CISC Trees. Owner Jake. Waitress Waiter Cook Helper Joyce Chris Max Len

Binary Search Trees. Contents. Steven J. Zeil. July 11, Definition: Binary Search Trees The Binary Search Tree ADT...

CSCI-401 Examlet #5. Name: Class: Date: True/False Indicate whether the sentence or statement is true or false.

Programming II (CS300)

Programming Languages and Techniques (CIS120)

Friday Four Square! 4:15PM, Outside Gates

Binary Search Trees Part Two

CE 221 Data Structures and Algorithms

Design and Analysis of Algorithms Lecture- 9: Binary Search Trees

Unit III - Tree TREES

COMS 3137 Class Notes

Transcription:

CMSC 341 Binary Search Trees CMSC 341 BST

Announcements Homework #3 dues Thursday (10/5/2017) Exam #1 next Thursday (10/12/2017) CMSC 341 BST

A Generic Tree CMSC 341 BST

Binary Tree CMSC 341 BST

The Binary Node Class private class BinaryNode<AnyType> // Constructors BinaryNode( AnyType theelement ) this( theelement, null, null ); BinaryNode( AnyType theelement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt ) element = theelement; left = lt; right = rt; AnyType element; // The data in the node BinaryNode<AnyType> left; // Left child reference BinaryNode<AnyType> right; // Right child reference CMSC 341 BST

Full Binary Tree A full binary tree is a binary tree in which every node is a leaf or has exactly two children. Theorem: A FBT with n internal nodes has n + 1 leaves (external nodes). CMSC 341 BST

Perfect Binary Tree n A Perfect Binary Tree is a Full Binary Tree in which all leaves have the same depth. Theorem: The number of nodes in a PBT is 2 h+1-1, where h is height. CMSC 341 BST

Complete Binary Tree A Complete Binary Tree is a binary tree in which every level is completed filled, except possibly the bottom level which is filled from left to right. CMSC 341 BST

Tree Traversals n Inorder n Preorder n Postorder n Levelorder (left, root, right) (root, left, right) (left, right, root) (per-level) CMSC 341 BST

Example PreOrder - 8, 5, 9, 7, 1, 12, 2, 4, 11, 3 InOrder - 9, 5, 1, 7, 2, 12, 8, 4, 3, 11 PostOrder - 9, 1, 2, 12, 7, 5, 3, 11, 4, 8 LevelOrder - 8, 5, 4, 9, 7, 11, 1, 12, 3, 2 2/24/2014 CMSC 341 BST 16

Binary Tree Construction Suppose that the elements in a binary tree are distinct. Can you construct the binary tree from which a given traversal sequence came? When a traversal sequence has more than one element, the binary tree is not uniquely defined. Therefore, the tree from which the sequence was obtained cannot be reconstructed uniquely. CMSC 341 BST

Binary Tree Construction Can you construct the binary tree, given two traversal sequences? Depends on which two sequences are given. CMSC 341 BST

Inorder And Preorder inorder = g d h b e i a f j c preorder = a b d g h e i c f j Scan the preorder left to right using the inorder to separate left and right subtrees. a is the root of the tree; gdhbei are in the left subtree; fjc are in the right subtree. a gdhbei CMSC 341 BST fjc

Inorder And Preorder a gdhbei fjc preorder = a b d g h e i c f j b is the next root; gdh are in the left subtree; ei are in the right subtree. a dh b ei fjc CMSC 341 BST

Inorder And Preorder a b gdh ei preorder = a b d g h e i c f j d is the next root; g is in the left subtree; h is in the right subtree. b a fjc fjc g d ei h CMSC 341 BST

Inorder And Postorder Scan postorder from right to left using inorder to separate left and right subtrees. inorder = g d h b e i a f j c postorder = g h d i e b j f c a Tree root is a; gdhbei are in left subtree; fjc are in right subtree. CMSC 341 BST

Inorder And Level Order Scan level order from left to right using inorder to separate left and right subtrees. inorder = g d h b e i a f j c level order = a b c d e f g h i j Tree root is a; gdhbei are in left subtree; fjc are in right subtree. CMSC 341 BST

Finding an element in a Binary Tree? n Return a reference to node containing x, return null if x is not found public BinaryNode<AnyType> find(anytype x) return find(root, x); private BinaryNode<AnyType> find( BinaryNode<AnyType> node, AnyType x) BinaryNode<AnyType> t = null; // in case we don t find it if ( node.element.equals(x) ) // found it here?? return node; // not here, look in the left subtree if(node.left!= null) t = find(node.left,x); // if not in the left subtree, look in the right subtree if ( t == null) t = find(node.right,x); // return reference, null if not found return t; CMSC 341 BST

Is this a full binary tree? boolean isfbt (BinaryNode<AnyType> t) // base case an empty tee is a FBT if (t == null) return true; // determine if this node is full // if just one child, return the tree is not full if ((t.left == null && t.right!= null) (t.right == null && t.left!= null)) return false; // if this node is full, ask its subtrees if they are full // if both are FBTs, then the entire tree is an FBT // if either of the subtrees is not FBT, then the tree is not return isfbt( t.right ) && isfbt( t.left ); CMSC 341 BST

Other Recursive Binary Tree Functions n Count number of interior nodes int countinteriornodes( BinaryNode<AnyType> t); n Determine the height of a binary tree. By convention (and for ease of coding) the height of an empty tree is -1 int height( BinaryNode<AnyType> t); n Many others CMSC 341 BST

Other Binary Tree Operations n How do we insert a new element into a binary tree? n How do we remove an element from a binary tree? CMSC 341 BST

Binary Search Tree n A Binary Search Tree is a Binary Tree in which, at every node v, the values stored in the left subtree of v are less than the value at v and the values stored in the right subtree are greater. n The elements in the BST must be comparable. n Duplicates are not allowed in our discussion. n Note that each subtree of a BST is also a BST. CMSC 341 BST

A BST of integers 42 20 50 A 27 32 35 60 99 25 B C D Describe the values which might appear in the subtrees labeled A, B, C, and D CMSC 341 BST

BST Implementation public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> private static class BinaryNode<AnyType> // Constructors BinaryNode( AnyType theelement ) this( theelement, null, null ); BinaryNode( AnyType theelement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt ) element = theelement; left = lt; right = rt; AnyType element; // The data in the node BinaryNode<AnyType> left; // Left child reference BinaryNode<AnyType> right; // Right child reference CMSC 341 BST

BST Implementation (2) private BinaryNode<AnyType> root; public BinarySearchTree( ) root = null; public void makeempty( ) root = null; public boolean isempty( ) return root == null; CMSC 341 BST

BST contains Method public boolean contains( AnyType x ) return contains( x, root ); private boolean contains( AnyType x, BinaryNode<AnyType> t ) if( t == null ) return false; int compareresult = x.compareto( t.element ); if( compareresult < 0 ) return contains( x, t.left ); else if( compareresult > 0 ) return contains( x, t.right ); else return true; // Match CMSC 341 BST

Performance of contains n Searching in randomly built BST is O(lg n) on average q but generally, a BST is not randomly built n Asymptotic performance is O(height) in all cases CMSC 341 BST

Implementation of printtree public void printtree() printtree(root); private void printtree( BinaryNode<AnyType> t ) if( t!= null ) printtree( t.left ); System.out.println( t.element ); printtree( t.right ); CMSC 341 BST

BST Implementation (3) public AnyType findmin( ) if( isempty( ) ) throw new UnderflowException( ); return findmin( root ).element; public AnyType findmax( ) if( isempty( ) ) throw new UnderflowException( ); return findmax( root ).element; public void insert( AnyType x ) root = insert( x, root ); public void remove( AnyType x ) root = remove( x, root ); CMSC 341 BST

The insert Operation private BinaryNode<AnyType> insert( AnyType x, BinaryNode<AnyType> t ) if( t == null ) return new BinaryNode<AnyType>( x, null, null ); int compareresult = x.compareto( t.element ); if( compareresult < 0 ) t.left = insert( x, t.left ); else if( compareresult > 0 ) t.right = insert( x, t.right ); else ; // Duplicate; do nothing return t; CMSC 341 BST

The remove Operation private BinaryNode<AnyType> remove( AnyType x, BinaryNode<AnyType> t ) if( t == null ) return t; // Item not found; do nothing int compareresult = x.compareto( t.element ); if( compareresult < 0 ) t.left = remove( x, t.left ); else if( compareresult > 0 ) t.right = remove( x, t.right ); else if( t.left!= null && t.right!= null ) // 2 children t.element = findmin( t.right ).element; t.right = remove( t.element, t.right ); else // one child or leaf t = ( t.left!= null )? t.left : t.right; return t; CMSC 341 BST

Implementations of find Max and Min private BinaryNode<AnyType> findmin( BinaryNode<AnyType> t ) if( t == null ) return null; else if( t.left == null ) return t; return findmin( t.left ); private BinaryNode<AnyType> findmax( BinaryNode<AnyType> t ) if( t!= null ) while( t.right!= null ) t = t.right; return t; CMSC 341 BST

Remove a node Constraint: delete a node, maintain BST property 1. Deleting a leaf. Easy. Just do it. BST property is not affected. 2. Deleting a non-leaf node v a. v has no left child -- replace v by its right child b. v has no right child -- replace v by its left child c. v has both left and right children, either: 1. Replace data in v by data of predecessor and delete predecessor 2. Replace data in v by data in successor and delete successor CMSC 341 BST

Performance of BST methods n What is the asymptotic performance of each of the BST methods? Best Case Worst Case Average Case contains insert remove findmin/ Max makeempty CMSC 341 BST

Predecessor in BST n Predecessor of a node v in a BST is the node that holds the data value that immediately precedes the data at v in order. n Finding predecessor q v has a left subtree n then predecessor must be the largest value in the left subtree (the rightmost node in the left subtree) q v does not have a left subtree n predecessor is the first node on path back to root that does not have v in its left subtree CMSC 341 BST

Successor in BST n Successor of a node v in a BST is the node that holds the data value that immediately follows the data at v in order. n Finding Successor q v has right subtree n successor is smallest value in right subtree (the leftmost node in the right subtree) q v does not have right subtree n successor is first node on path back to root that does not have v in its right subtree CMSC 341 BST

Tree Iterators n As we know there are several ways to traverse through a BST. For the user to do so, we must supply different kind of iterators. The iterator type defines how the elements are traversed. q InOrderIterator<T> inorderiterator(); q PreOrderIterator<T> preorderiterator(); q PostOrderIterator<T> postorderiterator(); q LevelOrderIterator<T> levelorderiterator(); CMSC 341 BST

BST as Arrays Parent: CMSC 341 BST

Binary Search Tree Operations Review

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

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

Insert void insert( x ) 15

Inserting a Node Insertion will always create a new leaf node In determining what to do, there are 4 choices 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 Insert the node at the current spot The current node is NULL (we ve reached a leaf) Do nothing (if we ve found a duplicate) UMBC CMSC 341 Binary Search Trees

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

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

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

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

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

Find Minimum Comparable findmin( )

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 node->value; else return findmin(t->left); UMBC CMSC 341 Binary Search Trees

Find Maximum Comparable findmax( )

Finding the Maximum 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 node->value; else return findmin(t->right); UMBC CMSC 341 Binary Search Trees

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

Delete the Entire Tree void makeempty ( )

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

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

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

Find a Specific Value boolean contains( x )

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

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, if t->right statements ); else return true; // Match use < so we only need to write one) UMBC CMSC 341 Binary Search Trees

Removing a Node void remove( x )

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

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

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

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

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

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

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

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

Ternary Operator Removal Code The ternary operator code for removal // ternary operator t = ( t->left!= NULL )? t->left : t->right; Can also be expressed as // if the left child isn't NULL if ( t->left!= NULL) t = t->left; else t = t->right; Actually the same code works for one or zero children! Why? // replace t with left child // else replace with right child UMBC CMSC 341 Binary Search Trees

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

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 UMBC CMSC 341 Binary Search Trees

Removing a Node Two Children We find z s successor y,which lies in z s right subtree and has no left child. We want to splice y out of its current location and have it replace z in the tree. If y is z s right child then we replace z by y, leaving y s right child alone. Otherwise, y lies within z s right subtree but is not z s right child. In this case, we first replace y by its own right child, and then we replace z by y. Remove node z UMBC CMSC 341 Binary Search Trees

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

Printing a Tree void printtree( )

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

Performance Run Time of BST Operations

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