420 likes | 582 Views
0. Jake’s Pizza Shop. Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper
E N D
0 Jake’s Pizza Shop Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len
A Tree Has a Root Node ROOT NODE Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len
Leaf nodes have no children LEAF NODES Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len
A Tree Has Levels Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEVEL 0
Level One LEVEL 1 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len
Level Two Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEVEL 2
A Subtree Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEFT SUBTREE OF ROOT NODE
Another Subtree Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len RIGHT SUBTREE OF ROOT NODE
Binary Tree A binary tree is a structure in which: Each node can have at most two children, and in which a unique path exists from the root to every other node. The two children of a node are called the left child and the right child, if they exist.
A Binary Tree V Q L T A E K S
How many leaf nodes? V Q L T A E K S
How many descendants of Q? V Q L T A E K S
V Q L T A E K S How many ancestors of K?
Implementing a Binary Tree with Pointers and Dynamic Data V Q L T A E K S
Each node contains two pointers struct TreeNode { ItemType info;// Data member TreeNode* left;// Pointer to left child TreeNode* right; // Pointer to right child }; NULL ‘A’6000 .left .info .right
// BINARY SEARCH TREE SPECIFICATION class TreeType { public: TreeType ( ); // constructor ~TreeType ( ); // destructor bool IsEmpty ( ) const; bool IsFull ( ) const; int NumberOfNodes ( ) const; void InsertItem ( ItemType item ); void DeleteItem (ItemType item ); void RetrieveItem ( ItemType& item, bool& found ); void PrintTree (ofstream& outFile) const; . . . private: TreeNode* root; }; 16
‘J’ TreeType ~TreeType ‘S’ ‘E’ IsEmpty InsertItem ‘H’ ‘A’ TreeType CharBST; Private data: root RetrieveItem PrintTree . . .
A Binary Search Tree (BST) is . . . A special kind of binary tree in which: 1. Each node contains a distinct data value, 2. The key values in the tree can be compared using “greater than” and “less than”, and 3. The key value of each node in the tree is less than every key value in its right subtree, and greater than every key value in its left subtree.
‘J’ Shape of a binary search tree . . . Depends on its key values and their order of insertion. Insert the elements ‘J’ ‘E’ ‘F’ ‘T’ ‘A’ in that order. The first value to be inserted is put into the root node.
‘J’ ‘E’ Inserting ‘E’ into the BST Thereafter, each value to be inserted begins by comparing itself to the value in the root node, moving left it is less, or moving right if it is greater. This continues at each level until it can be inserted as a new leaf.
‘J’ ‘E’ ‘F’ Inserting ‘F’ into the BST Begin by comparing ‘F’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf.
‘J’ ‘T’ ‘E’ ‘F’ Inserting ‘T’ into the BST Begin by comparing ‘T’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf.
‘J’ ‘T’ ‘E’ ‘A’ ‘F’ Inserting ‘A’ into the BST Begin by comparing ‘A’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf.
‘A’ What binary search tree . . . is obtained by inserting the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order?
‘A’ ‘E’ ‘F’ ‘J’ ‘T’ Binary search tree . . . obtained by inserting the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order.
‘J’ Another binary search tree ‘T’ ‘E’ ‘A’ ‘H’ ‘M’ ‘P’ ‘K’ Add nodes containing these values in this order: ‘D’ ‘B’ ‘L’ ‘Q’ ‘S’ ‘V’ ‘Z’
‘D’ ‘Z’ ‘K’ ‘B’ ‘L’ ‘Q’ ‘S’ Is ‘F’ in the binary search tree? ‘J’ ‘T’ ‘E’ ‘A’ ‘V’ ‘M’ ‘H’ ‘P’
// BINARY SEARCH TREE SPECIFICATION class TreeType { public: TreeType ( ) ; // constructor ~TreeType ( ) ; // destructor bool IsEmpty ( ) const ; bool IsFull ( ) const ; int NumberOfNodes ( ) const ; void InsertItem ( ItemType item ) ; void DeleteItem (ItemType item ) ; void RetrieveItem ( ItemType& item , bool& found ) ; void PrintTree (ofstream& outFile) const ; . . . private: TreeNode* root ; }; 28
// SPECIFICATION (continued) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // RECURSIVE PARTNERS OF MEMBER FUNCTIONS void PrintHelper ( TreeNode* ptr, ofstream& outFile ) ; void InsertHelper ( TreeNode*& ptr, ItemType item ) ; void RetrieveHelper (TreeNode* ptr, ItemType& item, bool& found ) ; void DestroyHelper ( TreeNode* ptr ) ; 29
0 // BINARY SEARCH TREE IMPLEMENTATION // OF MEMBER FUNCTIONS AND THEIR HELPER FUNCTIONS // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TreeType :: TreeType ( ) // constructor { root = NULL ; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool TreeType :: IsEmpty( ) const { return ( root == NULL ) ; } 30
void TreeType :: RetrieveItem ( ItemType& item, bool& found ) { RetrieveHelper ( root, item, found ) ; } void RetrieveHelper ( TreeNode* ptr, ItemType& item, bool& found) { if ( ptr == NULL ) found = false ; else if ( item < ptr->info ) // GO LEFT RetrieveHelper( ptr->left , item, found ) ; else if ( item > ptr->info ) // GO RIGHT RetrieveHelper( ptr->right , item, found ) ; else { item = ptr->info ; found = true ; } } 0 31
0 void TreeType :: InsertItem ( ItemType item ) { InsertHelper ( root, item ) ; } void InsertHelper ( TreeNode*& ptr, ItemType item ) { if ( ptr == NULL ) { // INSERT item HERE AS LEAF ptr = new TreeNode ; ptr->right = NULL ; ptr->left = NULL ; ptr->info = item ; } else if ( item < ptr->info ) // GO LEFT InsertHelper( ptr->left , item ) ; else if ( item > ptr->info ) // GO RIGHT InsertHelper( ptr->right , item ) ; } 32
‘J’ Inorder Traversal: A E H J M T Y 0 Print second tree ‘T’ ‘E’ ‘A’ ‘H’ ‘M’ ‘Y’ Print left subtree first Print right subtree last
0 // INORDER TRAVERSAL void TreeType :: PrintTree ( ofstream& outFile ) const { PrintHelper ( root, outFile ) ; } void PrintHelper ( TreeNode* ptr, ofstream& outFile ) { if ( ptr != NULL ) { PrintHelper( ptr->left , outFile ) ; // Print left subtree outFile << ptr->info ; PrintHelper( ptr->right, outFile ) ; // Print right subtree } } 34
‘J’ Preorder Traversal: J E A H T M Y 0 Print first tree ‘T’ ‘E’ ‘A’ ‘H’ ‘M’ ‘Y’ Print left subtree second Print right subtree last
‘J’ 0 Postorder Traversal: A H E M Y T J Print last tree ‘T’ ‘E’ ‘A’ ‘H’ ‘M’ ‘Y’ Print left subtree first Print right subtree second
0 TreeType :: ~TreeType ( ) // DESTRUCTOR { DestroyHelper ( root ) ; } void DestroyHelper ( TreeNode* ptr ) // Post: All nodes of the tree pointed to by ptr are deallocated. { if ( ptr != NULL ) { DestroyHelper ( ptr->left ) ; DestroyHelper ( ptr->right ) ; delete ptr ; } } 37
Deleting a Node 0 • Find node (return parent and node) • Four Cases: • Case 1 leaf node • Case 2 no left subtree • Case 3 no right subtree • Case 4 left and right subtrees
Case 1 Leaf Node 0 • Point parent to NULL • Delete node
Case 2 No Left Subtree 0 • Point parent to node right subtree • Delete node
Case 3 No Right Subtree 0 • Point parent to left subtree • Delete node
Case 4 Left and Right Subtrees 0 • Find node with greatest key in left subtree (or smallest key in right subtree) • Copy greatest (or smallest) key node data to delete node data • Delete greatest (or smallest) key node