Download Binary Search Trees

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Lattice model (finance) wikipedia , lookup

Quadtree wikipedia , lookup

B-tree wikipedia , lookup

Interval tree wikipedia , lookup

Red–black tree wikipedia , lookup

Binary tree wikipedia , lookup

Binary search tree wikipedia , lookup

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