Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Chapter 12. Binary Search Trees Search Trees • Data structures that support many dynamic-set operations. • Can be used both as a dictionary and as a priority queue. • Basic operations take time proportional to the height of the tree. – For complete binary tree with n nodes: worst case (lg n). – For linear chain of n nodes: worst case (n). • Different types of search trees include binary search trees, red-black trees (ch.13), and B-trees(ch.18). Binary Search Trees Binary search trees are an important data structure for dynamic sets. • Accomplish many dynamic-set operations in O(h) time, where h = height of tree. • We represent a binary tree by a linked list data structure in which each node is an object. • root[T ] points to the root of tree T . • Each node contains the fields – key (and possibly other satellite data). – left: points to left child. – right: points to right child. – p: points to parent. p[root[T ]] = NIL. • Stored keys must satisfy the binary-search-tree property. – If y is in left subtree of x, then key[y] ≤ key[x]. – If y is in right subtree of x, then key[y] ≥ key[x]. The binary-search-tree property allows us to print keys in a binary search tree in order, recursively, using an algorithm called an inorder tree walk. Elements are printed in monotonically increasing order. Correctness: Follows by induction directly from the binary-search-tree property. Time: Intuitively, the walk takes (n) time for a tree with n nodes, because we visit and print each node once. Preorder and Postorder Tree Walk PREORDER-TREE-WALK(x) if x = NIL then print key[x] PRE-ORDER-TREE-WALK(left[x]) PRE-ORDER-TREE-WALK(right[x]). POSTORDER-TREE-WALK(x) if x = NIL then POST-ORDER-TREE-WALK(left[x]) POST-ORDER-TREE-WALK(right[x]). print key[x] Querying a binary search tree Initial call: TREE-SEARCH(root[T ], k). Time: The algorithm recurses, visiting nodes on a downward path from the root. Thus, running time is O(h), where h is the height of the tree. Minimum and maximum The binary-search-tree property guarantees that • the minimum key of a binary search tree is located at the leftmost node, and • the maximum key of a binary search tree is located at the rightmost node. Traverse the appropriate pointers (left or right) until NIL is reached. Time: Both procedures run in O(h) time, where h is the height of the tree. -- Both visit nodes that form a downward path from the root to a leaf. Successor and Predecessor • Assumption: all keys are distinct. • The successor of a node x is the node y such that key[y] is the smallest key > key[x]. – We can find x’s successor based entirely on the tree structure. (No key comparisons are necessary). – If x has the largest key in the binary search tree, then we say that x’s successor is NIL. • There are two cases: 1. If node x has a non-empty right subtree, then x’s successor is the minimum in x’s right subtree. 2. If node x has an empty right subtree, notice that: – As long as we move to the left up the tree (move up through right children), we’re visiting smaller keys. – x’s successor y is the node that x is the predecessor of y (x is the maximum in y’s left subtree). TREE-PREDECESSOR is symmetric to TREE-SUCCESSOR. Example: 15 6 7 3 2 18 4 17 20 13 9 •Find the successor of the node with key value 15. (Answer: Key value 17) •Find the successor of the node with key value 6. (Answer: Key value 7) •Find the successor of the node with key value 4. (Answer: Key value 6) •Find the predecessor of the node with key value 6. (Answer: Key value 4) Time: Running time is O(h), where h is the height of the tree. For both the TREE-SUCCESSOR and TREE-PREDECESSOR procedures, in both cases, we visit nodes on a path down the tree or up the tree. Insertion and deletion • allows the dynamic set represented by a binary search tree to change. • The binary-search-tree property must hold after the change. • Insertion is more straightforward than deletion. Insertion • To insert value v into the binary search tree, the procedure is given node z, with key[z] = v, left[z] = NIL, and right[z] = NIL. • Beginning at root of the tree, trace a downward path, maintaining two pointers. – – Pointer x: traces the downward path. Pointer y: “trailing pointer” to keep track of parent of x. • Traverse the tree downward by comparing the value of node at x with v, and move to the left or right child accordingly. • When x is NIL, it is at the correct position for node z. • Compare z’s value with y’s value, and insert z at either y’s left or right, appropriately. • Time: Same as TREE-SEARCH. – On a tree of height h, procedure takes O(h) time. – TREE-INSERT can be used with INORDER-TREE-WALK to sort a given set of numbers. Deletion TREE-DELETE is broken into three cases. Case 1: z has no children. – Delete z by making the parent of z point to NIL, instead of to z. Case 2: z has one child. – Delete z by making the parent of z point to z’s child, instead of to z. Case 3: z has two children. – – – z’s successor y has either no children or one child. (y is the minimum node—with no left child—in z’s right subtree.) Delete y from the tree (via Case 1 or 2). Replace z’s key and data with y’s. F B A H D K C • Example: Demonstrate on the above sample tree. – – – • For Case 1, delete K. For Case 2, delete H. For Case 3, delete B, swapping it with C. Time: O(h), on a tree of height h. Minimizing running time • We’ve been analyzing running time in terms of h (the height of the binary search tree), instead of n (the number of nodes in the tree). – Problem: Worst case for binary search tree is (n) —no better than linked list. – Solution: Guarantee small height (balanced tree) —h = O(lg n). • In later chapters, by varying the properties of binary search trees, we will be able to analyze running time in terms of n. – Method: Restructure the tree if necessary. Nothing special is required for querying, but there may be extra work when changing the structure of the tree (inserting or deleting). • Red-black trees are a special class of binary trees that avoids the worst-case behavior of O(n) like “plain” binary search trees. – chap. 13.