Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Chapter 8 Binary Search Trees. 2 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len Jake’s Pizza Shop.

Similar presentations


Presentation on theme: "1 Chapter 8 Binary Search Trees. 2 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len Jake’s Pizza Shop."— Presentation transcript:

1 1 Chapter 8 Binary Search Trees

2 2 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len Jake’s Pizza Shop

3 3 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len ROOT NODE A Tree Has a Root Node

4 4 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEAF NODES Leaf Nodes have No Children

5 5 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEVEL 0 A Tree Has Leaves

6 6 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEVEL 1 Level One

7 7 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEVEL 2 Level Two

8 8 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len LEFT SUBTREE OF ROOT NODE A Subtree

9 9 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len RIGHT SUBTREE OF ROOT NODE Another Subtree

10 10 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. Binary Tree

11 11 A Binary Tree Q V T K S A E L

12 12 How many leaf nodes? Q V T K S A E L

13 13 How many descendants of Q? Q V T K S A E L

14 14 How many ancestors of K? (No Uncles Please; Asnwer=3(T,Q,V)) Q V T K S A E L

15 15 Implementing a Binary Tree with Pointers and Dynamic Data Q V T K S A E L

16 16 Node Terminology for a Tree Node

17 17 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. A Binary Search Tree (BST) is...

18 18 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. Shape of a binary search tree... ‘J’

19 19 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. Inserting ‘E’ into the BST ‘J’ ‘E’

20 20 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. Inserting ‘F’ into the BST ‘J’ ‘E’ ‘F’

21 21 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. Inserting ‘T’ into the BST ‘J’ ‘E’ ‘F’ ‘T’

22 22 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. Inserting ‘A’ into the BST ‘J’ ‘E’ ‘F’ ‘T’ ‘A’

23 23 is obtained by inserting the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order? What binary search tree... ‘A’

24 24 obtained by inserting the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order. Binary search tree... ‘A’ ‘E’ ‘F’ ‘J’ ‘T’

25 25 Another binary search tree Add nodes containing these values in this order: ‘D’ ‘B’ ‘L’ ‘Q’ ‘S’ ‘V’ ‘Z’ ‘J’ ‘E’ ‘A’ ‘H’ ‘T’ ‘M’ ‘K’ ‘P’

26 26 Is ‘F’ in the binary search tree? ‘J’ ‘E’ ‘A’ ‘H’ ‘T’ ‘M’ ‘K’ ‘V’ ‘P’ ‘Z’‘D’‘Q’‘L’‘B’‘S’

27 27 Class TreeType // Assumptions: Relational operators overloaded class TreeType { public: // Constructor, destructor, copy constructor... // Overloads assignment... // Observer functions... // Transformer functions... // Iterator pair... void Print(std::ofstream& outFile) const; private: TreeNode* root; };

28 28 bool TreeType::IsFull() const { NodeType* location; try { location = new NodeType; delete location; return false; } catch(std::bad_alloc exception) { return true; } bool TreeType::IsEmpty() const { return root == NULL; }

29 29 Tree Recursion CountNodes Version 1 if (Left(tree) is NULL) AND (Right(tree) is NULL) return 1 else return CountNodes(Left(tree)) + CountNodes(Right(tree)) + 1 What happens when Left(tree) is NULL?

30 30 Tree Recursion CountNodes Version 2 if (Left(tree) is NULL) AND (Right(tree) is NULL) return 1 else if Left(tree) is NULL return CountNodes(Right(tree)) + 1 else if Right(tree) is NULL return CountNodes(Left(tree)) + 1 else return CountNodes(Left(tree)) + CountNodes(Right(tree)) + 1 What happens when the initial tree is NULL?

31 31 Tree Recursion CountNodes Version 3 if tree is NULL return 0 else if (Left(tree) is NULL) AND (Right(tree) is NULL) return 1 else if Left(tree) is NULL return CountNodes(Right(tree)) + 1 else if Right(tree) is NULL return CountNodes(Left(tree)) + 1 else return CountNodes(Left(tree)) + CountNodes(Right(tree)) + 1 Can we simplify this algorithm?

32 32 Tree Recursion CountNodes Version 4 if tree is NULL return 0 else return CountNodes(Left(tree)) + CountNodes(Right(tree)) + 1 Is that all there is?

33 33 // Implementation of Final Version int CountNodes(TreeNode* tree); // Pototype int TreeType::LengthIs() const // Class member function { return CountNodes(root); } int CountNodes(TreeNode* tree) // Recursive function that counts the nodes { if (tree == NULL) return 0; else return CountNodes(tree->left) + CountNodes(tree->right) + 1; }

34 34 Retrieval Operation

35 35 Retrieval Operation void TreeType::RetrieveItem(int& item, bool& found) { Retrieve(root, item, found); } void Retrieve(TreeNode* tree, int& item, bool& found) { if (tree == NULL) found = false; else if (item info) Retrieve(tree->left, item, found);

36 36 Retrieval Operation, cont. else if (item > tree->info) Retrieve(tree->right, item, found); else { item = tree->info; found = true; }

37 37 The Insert Operation l A new node is always inserted into its appropriate position in the tree as a leaf.

38 38 Insertions into a Binary Search Tree

39 39 The recursive InsertItem operation

40 40 The tree parameter is a pointer within the tree

41 41 Recursive Insert void Insert(TreeNode*& tree, char item) { if (tree == NULL) {// Insertion place found. tree = new TreeNode; tree->right = NULL; tree->left = NULL; tree->info = item; } else if (item info) Insert(tree->left, item); else Insert(tree->right, item); }

42 42 Deleting Nodes from a BST l Deleting a node from a BST is not straightforward!! l We deal with three different cases, assuming we have already found the node n (A) Deleting a leaf node n (B) Deleting a node with one child n (C) Deleting a node with two children

43 43 Deleting A Leaf Node l Deleting a leaf node is only two-step operation n -Find the node n -Set its parent’s appropriate pointer to NULL and delete the node

44 44 Deleting a Leaf Node

45 45 Deleting A Node With One Child l Deleting a node with one child is somewhat tricky. We do not want to lose the descendents l We let the parent of the node being deleted skip over it and point to its child l Then the node is deleted

46 46 Deleting a Node with One Child

47 47 Deleting A Node With Two Children l Deleting a node with two children is the most difficult task!!!! l Its parent cannot be made to point to the two children with only one pointer l Instead, we can “copy” a selected node to the node being deleted and get rid of the other node

48 48 The “Selected” Node l The selected node is the node with highest value in the left subtree of the node to be deleted l This value will be found at the extreme right of the left subtree of the node to be deleted l For example, consider the diagram shown:

49 49 Deleting A Node With Two Children l Thus we will retain the BST structure without violating any of its formation rules l Now we can start developing the delete function that can detect and deal with the cases shown

50 50 Delete Function l We pass the pointer *to the item* being deleted to the function l If leftsubtree is NULL and rightsubtree is NULL, we can set the passed pointer to NULL l If one of the subtrees is not NULL, we set the pointer to that subtree l If both subtrees are not NULL, we have to find the predecessor and copy the information from the predecessor. Then the predecessor gets deleted. The program in the textbook is unnecessarily long

51 51 Delete Function Hierarchy l A public member function is invoked by the client code passing the key of the element to be deleted as a parameter l This function calls a helper function passing it the key and the root pointer l The helper function searches for the key and calls an auxiliary function when the key is matched l This auxiliary function deletes the node containing the key using matches to identify cases A, B or C

52 52 DeleteNode Algorithm if (Left(tree) is NULL) AND (Right(tree) is NULL) Set tree to NULL else if Left(tree) is NULL Set tree to Right(tree) else if Right(tree) is NULL Set tree to Left(tree) else Find predecessor Set Info(tree) to Info(predecessor) Delete predecessor

53 53 Code for DeleteNode void DeleteNode(TreeNode*& tree) { char data; TreeNode* tempPtr; tempPtr = tree; if (tree->left == NULL) { tree = tree->right; delete tempPtr; } else if (tree->right == NULL){ tree = tree->left; delete tempPtr;} els{ GetPredecessor(tree->left, data); tree->info = data; Delete(tree->left, data);} }

54 54 Definition of Recursive Delete Definition: Removes item from tree Size: The number of nodes in the path from the root to the node to be deleted. Base Case: If item's key matches key in Info(tree), delete node pointed to by tree. General Case: If item < Info(tree), Delete(Left(tree), item); else Delete(Right(tree), item).

55 55 Code for Recursive Delete void Delete(TreeNode*& tree, char item) { if (item info) Delete(tree->left, item); else if (item > tree->info) Delete(tree->right, item); else DeleteNode(tree); // Node found }

56 56 Deleting a Node with Two Children

57 57 Code for GetPredecessor void GetPredecessor(TreeNode* tree, char& data) { while (tree->right != NULL) tree = tree->right; data = tree->info; }

58 58 Printing all the Nodes in Order

59 59 Function Print Definition: Prints the items in the binary search tree in order from smallest to largest. Size: The number of nodes in the tree whose root is tree Base Case: If tree = NULL, do nothing. General Case: Traverse the left subtree in order. Then print Info(tree). Then traverse the right subtree in order.

60 60 Code for Recursive InOrder Print void PrintTree(TreeNode* tree, std::ofstream& outFile) { if (tree != NULL) { PrintTree(tree->left, outFile); outFile info; PrintTree(tree->right, outFile); } Is that all there is?

61 61 Destructor void Destroy(TreeNode*& tree); TreeType::~TreeType() { Destroy(root); } void Destroy(TreeNode*& tree) { if (tree != NULL) { Destroy(tree->left); Destroy(tree->right); delete tree; }

62 62 Algorithm for Copying a Tree if (originalTree is NULL) Set copy to NULL else Set Info(copy) to Info(originalTree) Set Left(copy) to Left(originalTree) Set Right(copy) to Right(originalTree)

63 63 Code for CopyTree void CopyTree(TreeNode*& copy, const TreeNode* originalTree) { if (originalTree == NULL) copy = NULL; else { copy = new TreeNode; copy->info = originalTree->info; CopyTree(copy->left, originalTree->left); CopyTree(copy->right, originalTree->right); }

64 64 Inorder(tree) if tree is not NULL Inorder(Left(tree)) Visit Info(tree) Inorder(Right(tree)) To print in alphabetical order

65 65 Postorder(tree) if tree is not NULL Postorder(Left(tree)) Postorder(Right(tree)) Visit Info(tree) Visits leaves first (good for deletion)

66 66 Preorder(tree) if tree is not NULL Visit Info(tree) Preorder(Left(tree)) Preorder(Right(tree)) Useful with binary trees (not binary search trees)

67 67 Three Tree Traversals

68 68 Our Iteration Approach l The client program passes the ResetTree and GetNextItem functions a parameter indicating which of the three traversals to use l ResetTree generates a queues of node contents in the indicated order l GetNextItem processes the node contents from the appropriate queue: inQue, preQue, postQue.

69 69 Code for ResetTree void TreeType::ResetTree(OrderType order) // Calls function to create a queue of the tree // elements in the desired order. { switch (order) { case PRE_ORDER : PreOrder(root, preQue); break; case IN_ORDER : InOrder(root, inQue); break; case POST_ORDER: PostOrder(root, postQue); break; }

70 70 void TreeType::GetNextItem(ItemType& item, OrderType order,bool& finished) { finished = false; switch (order) { case PRE_ORDER : preQue.Dequeue(item); if (preQue.IsEmpty()) finished = true; break; case IN_ORDER : inQue.Dequeue(item); if (inQue.IsEmpty()) finished = true; break; case POST_ORDER: postQue.Dequeue(item); if (postQue.IsEmpty()) finished = true; break; } Code for GetNextItem

71 71 Iterative Versions FindNode Set nodePtr to tree Set parentPtr to NULL Set found to false while more elements to search AND NOT found if item < Info(nodePtr) Set parentPtr to nodePtr Set nodePtr to Left(nodePtr) else if item > Info(nodePtr) Set parentPtr to nodePtr Set nodePtr to Right(nodePtr) else Set found to true

72 72 void FindNode(TreeNode* tree, ItemType item, TreeNode*& nodePtr, TreeNode*& parentPtr) { nodePtr = tree; parentPtr = NULL; bool found = false; while (nodePtr != NULL && !found) { if (item info) { parentPtr = nodePtr; nodePtr = nodePtr->left; } else if (item > nodePtr->info) { parentPtr = nodePtr; nodePtr = nodePtr->right; } else found = true; } Code for FindNode

73 73 InsertItem Create a node to contain the new item. Find the insertion place. Attach new node. Find the insertion place FindNode(tree, item, nodePtr, parentPtr);

74 74 Using function FindNode to find the insertion point

75 75 Using function FindNode to find the insertion point

76 76 Using function FindNode to find the insertion point

77 77 Using function FindNode to find the insertion point

78 78 Using function FindNode to find the insertion point

79 79 AttachNewNode if item < Info(parentPtr) Set Left(parentPtr) to newNode else Set Right(parentPtr) to newNode

80 80 AttachNewNode(revised) if parentPtr equals NULL Set tree to newNode else if item < Info(parentPtr) Set Left(parentPtr) to newNode else Set Right(parentPtr) to newNode

81 81 Code for InsertItem void TreeType::InsertItem(ItemType item) { TreeNode* newNode; TreeNode* nodePtr; TreeNode* parentPtr; newNode = new TreeNode; newNode->info = item; newNode->left = NULL; newNode->right = NULL; FindNode(root, item, nodePtr, parentPtr); if (parentPtr == NULL) root = newNode; else if (item info) parentPtr->left = newNode; else parentPtr->right = newNode; }

82 82 Code for DeleteItem void TreeType::DeleteItem(ItemType item) { TreeNode* nodePtr; TreeNode* parentPtr; FindNode(root, item, nodePtr, parentPtr); if (nodePtr == root) DeleteNode(root); else if (parentPtr->left == nodePtr) DeleteNode(parentPtr->left); else DeleteNode(parentPtr->right); }

83 83 PointersnodePtr and parentPtr Are External to the Tree

84 84 Pointer parentPtr is External to the Tree, but parentPtr-> left is an Actual Pointer in the Tree

85 85 With Array Representation For any node tree.nodes[index] its left child is in tree.nodes[index*2 + 1] right child is in tree.nodes[index*2 + 2] its parent is in tree.nodes[(index – 1)/2].

86 86 A Binary Tree and Its Array Representation

87 87 Definitions l Full Binary Tree: A binary tree in which all of the leaves are on the same level and every nonleaf node has two children

88 88 Definitions (cont.) l Complete Binary Tree: A binary tree that is either full or full through the next- to-last level, with the leaves on the last level as far to the left as possible

89 89 Examples of Different Types of Binary Trees

90 90 A Binary Search Tree Stored in an Array with Dummy Values


Download ppt "1 Chapter 8 Binary Search Trees. 2 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len Jake’s Pizza Shop."

Similar presentations


Ads by Google