We study several alternative data structures based on trees for
realizing ordered dictionary.
The fundamental operations in an ordered
dictionary ADT are:
find(k) -
Return the position of an item with key k,
and return a null
position if no such item exists.
findAll(k) -
Return an iterator of positions for all items with key k, and
return a null position
if no such item exists.
insertItem(k,e)
- Inserts an item with element e
and key k.
removeElement(k)
- Remove an item with key k.
An error condition occurs if there is no such item.
removeAllElements(k)
- Remove all items with key equal to k.
closestBefore(k)-
Return a position of an item with the largest key less than or equal to
k.
closestAfter(k)
- Return a position of an item with
the smallest key greater than or equal to k.
9.1 Binary Search Trees (rminder)
A binary search tree is a binary tree storing keys (or
key-element pairs) at its internal nodes and satisfying the following
property:
Let u, v, and w be three nodes such that u is in the left subtree of v and w is in the right subtree of v.
We have key(u) ≤ key(v) ≤ key(w)
External nodes do not store items
Inorder traversal visits the keys of its dictionary in
nondecreasing
order.
9.1.1 Searching
To search for a key k,
we trace a downward path starting at the root
The next node visited depends on the outcome of the comparison of k with the key
of the current node
If we reach a leaf, the key is not found and we return a
null position
Algorithmfind (k, v)
if T.isExternal (v)
return Position(null)
if k < key(v)
return find(k, T.leftChild(v))
else if k = key(v)
return Position(v)
else { k > key(v) }
return find(k, T.rightChild(v))
Example: find(4)
Analysis of Binary Tree Searching
Function find(k)
on
dictionary D runs O(h)
time, where h is the height
of the binary search tree T
used to implement D.
9.1.2 Update Operations
Insertion
To perform operation insertItem(k, e), we search for key k
Assume k is not
already in the tree, and let w
be the
leaf reached by the search
We insert k at
node w and expand w into an internal node
Example: insert 5
Removal
To perform operation removeElement(k), we search for key k
Assume key k is in
the tree, and let let v be
the node storing k
If node v has a
leaf child w, we remove v and w from the tree with operation removeAboveExternal(w)
Example: remove 4
We consider the case where the key k to be removed is stored at a node
v whose children are both
internal
we find the internal node w that follows v in an inorder traversal
we copy key(w) into node v
we remove node w
and its left child z (which
must be a leaf) by means of operation removeAboveExternal(z)
Example: remove 3
Best-case versus Worst-case
Consider a dictionary with n
items implemented by means of a
binary search tree of height h
the space used is O(n)
methods findElement(),
insertItem() and removeElement() take O(h)
time
The height is O(n) in the worst case and O(log n) in the best case