Tree traversals BST properties Search Insertion Binary Search Trees Tree traversals BST properties Search Insertion October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien Binary tree traversal A traversal algorithm for a binary tree visits each node in the tree Typically, it will do something while visiting each node! Traversal algorithms are naturally recursive There are three traversal methods inOrder preOrder postOrder October 30, 2017 Hassan Khosravi / Geoffrey Tien
inOrder traversal algorithm void inOrder(BNode* nd) { if (nd != NULL) inOrder(nd->left); visit(nd); inOrder(nd->right); } typedef struct BNode { int data; struct BNode* left; struct BNode* right; } BNode; The visit function would do whatever the purpose of the traversal is (e.g. print the data value of the node). October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien preOrder traversal visit(nd); preOrder(nd->left); 1 preOrder(nd->right); 17 2 6 visit visit 13 27 preOrder(left) preOrder(left) preOrder(right) preOrder(right) 3 5 7 8 visit visit visit 9 16 20 39 preOrder(left) preOrder(left) preOrder(left) preOrder(right) preOrder(right) preOrder(right) visit 4 preOrder(left) preOrder(right) 11 visit preOrder(left) preOrder(right) October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien postOrder traversal postOrder(nd->left); postOrder(nd->right); 8 visit(nd); 17 4 7 postOrder(left) postOrder(left) 13 27 postOrder(right) postOrder(right) visit visit 2 3 5 6 postOrder(left) postOrder(left) postOrder(left) 9 16 20 39 postOrder(right) postOrder(right) postOrder(right) visit visit visit postOrder(left) 1 postOrder(right) visit postOrder(left) 11 postOrder(right) visit October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien Exercise What will be printed by an in-order traversal of the tree? preOrder? postOrder? inOrder(nd->left); 17 visit(nd); inOrder(nd->right); 9 27 6 16 20 31 Food for thought: which traversal will be useful for copying a tree? Deallocating all nodes? 12 39 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Before we begin... Another type of tree traversal We have seen pre-order, in-order, post-order traversals What about a traversal that visits every node in a level before working on the next level? level-order traversal 41 33 87 21 74 36 45 78 25 Use some ADT to support this? October 30, 2017 Hassan Khosravi / Geoffrey Tien
Binary search trees A data structure for the Dictionary ADT? A binary search tree is a binary tree with a special property For all nodes in the tree: All nodes in a left subtree have labels less than the label of the subtree's root All nodes in a right subtree have labels greater than or equal to the label of the subtree's root Binary search trees are fully ordered October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST example 17 13 27 9 16 20 39 11 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST inOrder traversal inOrder(nd->leftchild); inOrder traversal on a BST retrieves data in sorted order visit(nd); 5 inOrder(nd->rightchild); 17 3 7 inOrder(left) inOrder(left) 13 27 visit visit inOrder(right) inOrder(right) 1 4 6 8 inOrder(left) inOrder(left) inOrder(left) 9 visit 16 20 visit 39 visit inOrder(right) inOrder(right) inOrder(right) inOrder(left) 2 visit inOrder(right) inOrder(left) 11 visit inOrder(right) October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST implementation Binary search trees can be implemented using a reference structure Tree nodes contain data and two pointers to nodes BNode* leftchild data BNode* rightchild Data to be stored in the tree (usually an object) References or pointers to other tree Nodes October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST search To find a value in a BST search from the root node: If the target is less than the value in the node search its left subtree If the target is greater than the value in the node search its right subtree Otherwise return true, (or a pointer to the data, or …) How many comparisons? One for each node on the path Worst case: height of the tree + 1 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST search example search(27); 17 27 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST search example search(16); 17 13 16 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST search example search(12); 17 13 9 11 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Search implementation Search can be implemented iteratively or recursively int search(BNode* nd, int key) { if (nd == NULL) return FALSE; else if (nd->data == key) return TRUE; else { if (key < nd->data) return search(nd->left, key); else return search(nd->right, key); } October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST insertion The BST property must hold after insertion Therefore the new node must be inserted in the correct position This position is found by performing a search If the search ends at the (null) left child of a node make its left child refer to the new node If the search ends at the right child of a node make its right child refer to the new node The cost is about the same as the cost for the search algorithm, O(height) October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST insertion example Insert 43 47 Create new node Find position 32 63 Link node 19 41 54 79 43 10 23 37 44 53 59 96 7 12 30 43 57 91 97 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien BST insertion example Create new BST 3 Insert 3 Insert 15 15 Insert 21 Insert 23 21 Insert 37 Search 45 23 How many operations for Search? Complexity? 37 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Insert implementation Insert can also be implemented iteratively or recursively BNode* insert(BNode* nd, int key) { if (nd == NULL) { BNode* newnode = (BNode*) malloc(sizeof(BNode)); newnode->data = key; newnode->left = NULL; newnode->right = NULL; return newnode; } else { if (key < nd->data) nd->left = insert(nd->left, key); else nd->right = insert(nd->right, key); return nd; October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien Find Min, Find Max Find minimum: From the root, keep following left child links until no more left child exists (i.e. NULL) Find maximum: From the root, follow right child links until no more right child exists 43 18 68 12 7 9 33 52 56 67 27 39 50 21 October 30, 2017 Hassan Khosravi / Geoffrey Tien
Hassan Khosravi / Geoffrey Tien Exercise Write iterative implementations for: // returns TRUE or FALSE int search(BNode* nd, int key) // returns the root of the subtree receiving the // inserted item BNode* insert(BNode* nd, int key) // returns the value of the minimum key int findMin(BNode* nd) // returns the value of the maximum key int findMax(BNode* nd) October 30, 2017 Hassan Khosravi / Geoffrey Tien
Readings for this lesson Thareja Chapter 9.4 10.1 – 10.2.2, 10.2.4 – 10.2.5, 10.2.8 – 10.2.9 Next class: Thareja Chapter 10.2.3 October 30, 2017 Hassan Khosravi / Geoffrey Tien