Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSE1303 Part A Data Structures and Algorithms Lecture A13 – Binary Search Trees (Information Retrieval)

Similar presentations


Presentation on theme: "CSE1303 Part A Data Structures and Algorithms Lecture A13 – Binary Search Trees (Information Retrieval)"— Presentation transcript:

1 CSE1303 Part A Data Structures and Algorithms Lecture A13 – Binary Search Trees (Information Retrieval)

2 2 Overview Binary Search Trees. Hash Tables.

3 3 Recall - Binary Search Tree A Binary Tree such that: Every node entry has a unique key. All the keys in the left subtree of a node are less than the key of the node. All the keys in the right subtree of a node are greater than the key of the node.

4 4 Example 1: 31 43 64 20 4056 28334759 89 key is an integer

5 5 Fred Dan Mary Alan Eve BillEric Kate GregLen Sue Example 2: key is a string

6 6 Binary Tree Node entry link to right child node link to left child node

7 7 struct TreeNodeRec { int key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; Binary Search Tree Node Example 1:

8 8 Example 2: Binary Search Tree Node #define MAXLEN 15 struct TreeNodeRec { char key[MAXLEN]; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode;

9 9 Recall: maximum string length is fixed #define MAXLEN 15 struct TreeNodeRec { char key[MAXLEN]; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode;

10 10 struct TreeNodeRec { char* key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; Recall: Allows strings of arbitrary length. Memory needs to be allocated dynamically before use. Use strcmp to compare strings.

11 11

12 12 struct BookRec { char* author; char* title; char* publisher; /* etc.: other book information. */ }; typedef struct BookRec Book; Book Record key

13 13 struct TreeNodeRec { Book info; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; Example 4: Binary Search Tree Node

14 14 struct TreeNodeRec { float key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; Tree Node

15 15 #ifndef TREEH #define TREEH struct TreeNodeRec { float key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; TreeNode* makeTreeNode(float value); TreeNode* insert(TreeNode* nodePtr, float item); TreeNode* search(TreeNode* nodePtr, float item); void printInorder(const TreeNode* nodePtr); void printPreorder(const TreeNode* nodePtr); void printPostorder(const TreeNode* nodePtr); #endif

16 16 MakeNode parameter: item to be inserted steps: –allocate memory for the new node –check if memory allocation is successful –if so, put item into the new node –set left and right branches to NULL returns: pointer to (i.e. address of) new node

17 17 TreeNode* makeTreeNode(float value) { TreeNode* newNodePtr = NULL; newNodePtr = (TreeNode*)malloc(sizeof(TreeNode)); if (newNodePtr == NULL) { fprintf(stderr, “Out of memory\n”); exit(1); } else { newNodePtr->key = value; newNodePtr->leftPtr = NULL; newNodePtr->rightPtr = NULL; } return newNodePtr; }

18 18 0x2000 newNodePtr NULL 0x2000 newNodePtr 0x2000 newNodePtr 3.3 NULL value 3.3

19 19 Inorder Inorder traversal of a Binary Search Tree always gives the sorted order of the keys. void printInorder(TreeNode* nodePtr) { } initially, pointer to root node traverse left sub-tree visit the node traverse right sub-tree

20 20 Inorder Inorder traversal of a Binary Search Tree always gives the sorted order of the keys. void printInorder(TreeNode* nodePtr) { printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } if (nodePtr != NULL) { }

21 21Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

22 22Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

23 23Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

24 24Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

25 25Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

26 26Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

27 27Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

28 28Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

29 29Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

30 30Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

31 31Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

32 32Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

33 33Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

34 34Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

35 35Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

36 36Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

37 37Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

38 38Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

39 39Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

40 40Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

41 41Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

42 42Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

43 43Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

44 44Inorder void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } nodePtr

45 45 Search 31 43 64 20 4056 28334759 89 Example: 59 57 found 45

46 46 Search 31 43 64 20 4056 28334759 89 Example: 61 57 failed 46

47 47 Search: Checklist if target key is less than current node’s key, search the left sub-tree. else, if target key is greater than current node’s key, search the right sub-tree. returns: –if found, or if target key is equal to current node’s key, a pointer to node containing target key. –otherwise, NULL pointer. (Recall binary search)

48 48 TreeNode* search(TreeNode* nodePtr, float target) { if (nodePtr != NULL) { if (target key) { nodePtr = search(nodePtr->leftPtr, target); } else if (target > nodePtr->key) { nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; }

49 49 /* …other bits of code omitted… */ printf(“Enter target ”); scanf(“%f”, &item); if (search(rootPtr, item) == NULL) { printf(“Item was not found\n”); } else { printf(“Item found\n”); } /* …and so on… */ Function Call to Search

50 50Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.7 nodePtr

51 51Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.7 nodePtr

52 52Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.7 nodePtr

53 53Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.7 nodePtr

54 54Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.5 nodePtr

55 55Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.5 nodePtr

56 56Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.5 nodePtr

57 57Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.5 nodePtr

58 58Search TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Find 0.5 nodePtr

59 59 Insert 31 43 64 20 4056 28334759 89 Example: 57

60 60 Insert 31 43 64 20 4056 28334759 89 Example: 57

61 61 Insert Create new node for the item. Find a parent node. Attach new node as a leaf.

62 62 Insert: Recursive parameters: –pointer to current node (initially: root node). –item to be inserted. If current node is NULL –Create a new node and return it. Else if item’s key is less (greater) than current node’s key: –otherwise, let the left (right) child node be the current node, setting the parent left (right) link equal that node, and repeat recursively.

63 63 TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) { nodePtr = makeTreeNode(item); } else if (item key) { nodePtr->leftPtr = insert(nodePtr->leftPtr, item); } else if (item > nodePtr->key) { nodePtr->rightPtr = insert(nodePtr->rightPtr, item); } return nodePtr; }

64 64 /* …other bits of code omitted… */ printf(“Enter number of items ”); scanf(“%d”, &n); for (i = 0; i < n; i++) { scanf(“%f”, &item); rootPtr = insert(rootPtr, item); } /* …and so on… */ Function Call to Insert

65 65Insert TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Insert 0.9 nodePtr

66 66Insert TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Insert 0.9 nodePtr

67 67Insert TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Insert 0.9 nodePtr

68 68Insert TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Insert 0.9 nodePtr

69 69Insert TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } 1.0 1.81.1 2.71.4 1.9 0.40.7 0.8 0.3 0.6 Insert 0.9 nodePtr 0.9

70 70 Sorting To sort a sequence of items: Insert items into a Binary Search Tree. Then Inorder Traverse the tree.

71 71Sort Sort the following list into a binary search tree 0.51.00.72.12.53.6

72 72Sort 0.51.00.7 2.1 2.53.6 1.0 Sort the following list into a binary search tree

73 73Sort 0.51.00.7 2.1 2.53.6 1.0 2.5 Sort the following list into a binary search tree

74 74Sort 0.51.00.7 2.1 2.53.6 1.0 2.50.5 Sort the following list into a binary search tree

75 75Sort 0.51.00.72.12.53.6 1.0 2.50.5 0.7 Sort the following list into a binary search tree

76 76Sort 1.0 2.50.5 0.73.6 Sort the following list into a binary search tree 0.51.00.72.12.53.6

77 77Sort 0.51.00.72.12.53.6 1.0 2.50.5 0.73.62.1 Sort the following list into a binary search tree

78 78 Sorting: Analysis Insert (i+1) th item: ~ log 2 (i) comparisons ~ log 2 n Average Case: O(n log(n))

79 79 Sorting: Analysis Insert (i+1) th item: ~ i comparisons Example: Insert: 1, 3, 7, 9, 11, 15 Worst Case: O(n 2 )

80 80Revision Binary Search Tree Make Tree Node, Insert item, Search for an item, and Print Inorder. Tree sort. Revision: Reading Kruse 9 Standish 9 Langsam 5 Deitel & Deitel 12.7 Preparation Next lecture: Hash Tables Read Chapter 8.6 in Kruse et al.


Download ppt "CSE1303 Part A Data Structures and Algorithms Lecture A13 – Binary Search Trees (Information Retrieval)"

Similar presentations


Ads by Google