* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Binary Search Trees
Survey
Document related concepts
Transcript
Binary Search Trees • • • • • What is a binary search tree? Inordered search of a binary search tree Find Min & Max Predecessor and successor BST insertion and deletion Sept. 2016 Binary Trees Recursive definition 1. An empty tree is a binary tree 2. A node with two child subtrees is a binary tree 3. Let A and B be two binary trees. A tree with root r, and A and B as its left and right subtrees, respectively, is a binary tree. 56 26 Is this a binary tree? btrees - 2 28 18 12 200 24 190 27 213 Binary Search Trees A BST is a data structures that can support dynamic set operations. » Search, Inorderred travresal, Minimum, Maximum, Predecessor, Successor, Insert, and Delete. Can be used to build » Dictionaries. » Priority Queues. Basic operations take time proportional to the height of the tree – O(h). btrees - 3 BST – Representation Represented by a linked data structure of nodes. root(T) points to the root of tree T. Each node contains fields: » » » » btrees - 4 key left – pointer to left child: root of left subtree. right – pointer to right child : root of right subtree. p – pointer to parent. p[root[T]] = NIL (optional). Binary Search Tree Property Stored keys must satisfy the binary search tree property. » y in left subtree of x, then key[y] < key[x]. » y in right subtree of x, then key[y] key[x]. 26 200 28 18 12 btrees - 5 56 24 27 190 213 Inorder Traversal The binary-search-tree property allows the keys of a binary search tree to be printed, in (monotonically increasing) order, recursively. Inorder-Tree-Walk (x) 1. if x NIL 2. then Inorder-Tree-Walk(left[p]) 3. print key[x] 4. Inorder-Tree-Walk(right[p]) How long does the walk take? Can you prove its correctness? btrees - 6 56 26 28 18 12 200 24 27 190 213 Correctness of Inorder-Walk Must prove that it prints all elements, in order, and that it terminates. By induction on size of tree. Size=0: Easy. Size >1: » Prints left subtree in order by induction. » Prints root, which comes after all elements in left subtree (still in order). » Prints right subtree in order (all elements come after root, so still in order). btrees - 7 Querying a Binary Search Tree All dynamic-set search operations can be supported in O(h) time. h = (lg n) for a balanced binary tree (and for an average tree built by adding nodes in random order.) h = (n) for an unbalanced tree that resembles a linear chain of n nodes in the worst case. btrees - 8 Tree Search Tree-Search(x, k) 1. if x = NIL or k = key[x] 2. then return x 3. if k < key[x] 4. then return Tree-Search(left[x], k) 5. else return Tree-Search(right[x], k) 56 26 btrees - 9 28 18 Running time: O(h) Aside: tail-recursion 200 12 24 27 190 213 Iterative Tree Search Iterative-Tree-Search(x, k) 1. while x NIL and k key[x] 2. do if k < key[x] 3. then x left[x] 4. else x right[x] 5. return x 56 26 200 28 18 12 24 190 27 The iterative tree search is more efficient on most computers. The recursive tree search is more straightforward. btrees - 10 213 Finding Min & Max The binary-search-tree property guarantees that: » The minimum is located at the left-most node. » The maximum is located at the right-most node. Tree-Minimum(x) 1. while left[x] NIL 2. do x left[x] 3. return x Q: How long do they take? btrees - 11 Tree-Maximum(x) 1. while right[x] NIL 2. do x right[x] 3. return x Predecessor and Successor Successor of node x is the node y such that key[y] is the smallest key greater than key[x]. The successor of the largest key is NIL. Search consists of two cases. » If node x has a non-empty right subtree, then x’s successor is the minimum in the right subtree of x. » If node x has an empty right subtree, then: • As long as we move to the left up the tree (move up through right children), we are visiting smaller keys. • x’s successor y is the node that is the predecessor of x (x is the maximum in y’s left subtree). • In other words, x’s successor y, is the lowest ancestor of x whose left child is also an ancestor of x or is x itself. btrees - 12 Pseudo-code for Successor Tree-Successor(x) 1. if right[x] NIL 2. then return Tree-Minimum(right[x]) 3. y p[x] 4. while y NIL and x = right[y] 5. do x y 6. y p[y] 7. return y btrees - 13 56 26 200 28 18 Code for predecessor is symmetric. Running time: O(h) NIL 12 24 27 190 213 BST Insertion – Pseudocode Change the dynamic set represented by a BST. Ensure the binarysearch-tree property holds after change. Insertion is easier than deletion. 56 26 200 28 18 12 btrees - 14 24 27 190 213 Tree-Insert(T, z) 1. y NIL 2. x root[T] 3. while x NIL 4. do y x 5. if key[z] < key[x] 6. then x left[x] 7. else x right[x] 8. p[z] y 9. if y = NIL 10. then root[t] z 11. else if key[z] < key[y] 12. then left[y] z 13. else right[y] z Analysis of Insertion Initialization: O(1) While loop in lines 3-7 searches for place to insert z, maintaining parent y. This takes O(h) time. Lines 8-13 insert the value: O(1) TOTAL: O(h) time to insert a node. btrees - 15 Tree-Insert(T, z) 1. y NIL 2. x root[T] 3. while x NIL 4. do y x 5. if key[z] < key[x] 6. then x left[x] 7. else x right[x] 8. p[z] y 9. if y = NIL 10. then root[t] z 11. else if key[z] < key[y] 12. then left[y] z 13. else right[y] z Exercise: Sorting Using BSTs Sort (A) for i 1 to n do tree-insert(A[i]) inorder-tree-walk(root) » What are the worst case and best case running times? » In practice, how would this compare to other sorting algorithms? btrees - 16 Tree-Delete (T, z) if z has no children case 0 then remove z if z has one child case 1 z then make p[z] point to child if z has two children (subtrees) case 2 then swap z with its successor perform case 0 or case 1 to delete it TOTAL: O(h) time to delete a node btrees - 17 z z z Tree-Delete (T, z) Illustration for case 2: z exchange successor(z) btrees - 18 Deletion – Pseudocode Tree-Delete(T, z) /* Determine which node to splice out: either z or z’s successor. */ 1. if left[z] = NIL or right[z] = NIL 2. then y z /*Case 0 or Case 1*/ 3. else y Tree-Successor[z] /*Case 2*/ /* Set x to a non-NIL child of y, or to NIL if y has no children. */ 4. if left[y] NIL /*y has one child or no child.*/ 5. then x left[y] /*x can be a child of y or NIL.*/ 6. else x right[y] /* y is removed from the tree by manipulating pointers of p[y] and x */ 7. if x NIL 8. then p[x] p[y] /* Continued on next slide */ btrees - 19 Deletion – Pseudocode Tree-Delete(T, z) (Contd. from previous slide) 9. if p[y] = NIL /*if y is the root*/ 10. then root[T] x 11. else if y = left[p[y]] /*y is a left child.*/ 12. then left[p[y]] x 13. else right[p[y]] x /* If z’s successor was spliced out, copy its data into z */ 14. if y z /*y is z’s successor.*/ 15. then key[z] key[y] 16. copy y’s satellite data into z. 17. return y btrees - 20 Correctness of Tree-Delete How do we know case 2 should go to case 0 or case 1 instead of back to case 2? » Because when x has 2 children, its successor is the minimum in its right subtree, and that successor has no left child (hence 0 or 1 child). Equivalently, we could swap with predecessor instead of successor. It might be good to alternate to avoid creating lopsided tree. btrees - 21 Binary Search Trees View today as data structures that can support dynamic set operations. » Search, Minimum, Maximum, Predecessor, Successor, Insert, and Delete. Can be used to build » Dictionaries. » Priority Queues. Basic operations take time proportional to the height of the tree – O(h). btrees - 22 Red-black trees: Overview Red-black trees are a variation of binary search trees to ensure that the tree is balanced. » Height is O(lg n), where n is the number of nodes. Operations take O(lg n) time in the worst case. btrees - 23 Red-black Tree Binary search tree + 1 bit per node: the attribute color, which is either red or black. All other attributes of BSTs are inherited: » key, left, right, and p. If a child or the parent of a node does not exist, the corresponding pointer field of the node contains the value nil. Sentinel - nil[T ], representing all the nil nodes. btrees - 24 Red-black Tree – Example 26 17 41 30 47 38 btrees - 25 50 Red-black Tree – Example nil 26 17 nil 41 nil 30 47 nil 38 nil btrees - 26 50 nil nil nil Red-black Tree – Example 26 17 41 30 47 38 nil[T] btrees - 27 50 Red-black Properties 1. 2. 3. 4. Every node is either red or black. The root is black. Every leaf (nil) is black. If a node is red, then both its children are black. 5. For each node, all paths from the node to descendant leaves contain the same number of black nodes. btrees - 28 Height of a Red-black Tree Height of a node: » Number of edges in a longest path to a leaf. Black-height of a node x, bh(x): » bh(x) is the number of black nodes (including nil[T ]) on the path from x to leaf, not counting x. Black-height of a red-black tree is the black-height of its root. » By Property 5, black height is well defined. btrees - 29 Height of a Red-black Tree h=4 26 bh=2 Example: Height of a node: » Number of edges in a longest path to a leaf. Black-height of a node bh(x) is the number of black nodes on path from x to leaf, not counting x. 17 h=1 bh=1 h=2 30 bh=1 h=1 bh=1 38 nil[T] btrees - 30 h=3 41 bh=2 h=2 47 bh=1 h=1 50 bh=1