Binary Search Trees
Download
Report
Transcript Binary Search Trees
Binary Search Trees
Chapter 6
1
Objectives
You will be able to
Implement and use binary search trees in
C++ programs.
Determine the time complexity of
searching binary search trees.
2
Searching
We often need to find a specific item in
a collection of items.
Or determine that it is not present.
The simplest strategy is a linear search.
Traverse the collection looking for the
target item.
Time for a linear search is O(n).
Grows in proportion to the number of items in
the collection, n.
3
Binary Search
If an array is ordered, we can make the search
much faster by doing a binary search.
If length of the array is 0,
Check the middle item.
If search target is equal
Return that item.
If the search target is less:
Search target is not present. Report failure.
Do a binary search of the lower half.
If the search target greater
Do a binary search of the upper half.
4
Binary Search
Usually outperforms a linear search
Disadvantage:
Requires a sequential storage
Not appropriate for linked lists (Why?)
A linked structure is desirable if we do
very much inserting and deleting.
It is possible to use a linked structure
which can be searched in a binary-like
manner.
5
Binary Search Tree
49
66
28
13
35
62
80
Everything in left subtree is less than root.
Everything in right subtree is greater than root.
Recursively!
6
Tree
A data structure which consists of
a finite set of elements called nodes or vertices.
a finite set of directed arcs which connect the
nodes.
If the tree is nonempty -
One of the nodes (the root) has no incoming arc.
Every other node can be reached by following a
unique sequence of consecutive arcs starting at
the root.
7
Tree Terminology
Root node
• Children of the parent (3)
Leaf nodes
• Siblings to each other
8
Binary Tree
Each node has at most two children
Examples
Results of multiple coin tosses
Encoding/decoding messages in dots and
dashes such as Morse code
9
Implementation
A binary tree ADT can be implemented
either as a linked structure or as an
array.
10
Array Implementation of Binary Trees
0
O
2
1
T
M
4
3
C
E
6
5
P
U
Store node n in location n of the array.
11
Array Implementation of Binary Trees
Works OK for complete trees, not for sparse trees
12
Linked Implementation of Binary Trees
Uses space more efficiently
for incomplete trees
Provides additional flexibility
Each node has two links
One to the left child of the node
One to the right child of the node
If no child node exists for a node, the link is
set to NULL
13
Structural Recursion
The subset of a binary tree consisting of any node
an all of its descendents is a binary tree.
0
O
2
1
T
M
4
3
C
E
6
5
P
U
Invites the use of recursive algorithms on binary trees.
14
Recursive Algorithm for Binary Tree Traversal
If the binary tree is empty
Do nothing
Else
N: Visit the Node, process data
L: Traverse the left subtree
R: Traverse the right subtree
The "anchor"
The inductive step
15
Binary Tree Traversal Order
Three possibilities for inductive step …
Left subtree, Node, Right subtree
Inorder traversal
Node, Left subtree, Right subtree
the preorder traversal
Left subtree, Right subtree, Node
the postorder traversal
16
Binary Search Tree ADT
Binary Search Tree
A Collection of Nodes
Data
Must have <= and == operations
Left Child
Right Child
For each node x
value in left child ≤ value in x ≤ value in right child
17
BST Basic Operations
Construct an empty BST
Determine if BST is empty
Search BST for given item
Insert a new item in the BST
Delete an item from the BST
Maintain the BST property
Maintain the BST property
Traverse the BST
Visit each node exactly once
The inorder traversal will visit the values in the nodes in
ascending order
18
Example
Create new empty C++ console
application project.
Add to project:
genBST1.h
main.cpp
19
main.cpp
#include <iostream>
#include "genBST1.h"
using namespace std;
int main(void)
{
cout << "This is BST_Demo\n";
cin.get();
return 0;
}
Build and test.
20
genBST1.h
Copy from Downloads area:
http://www.cse.usf.edu/~turnerr/Data_Structures/Downloads/
2011_03_02_Binary_Search_Tree/genBST1.h.txt
This is a subset of Drozdek’s genBST.h
template.
Figure 6.8, page 221 ff.
All textbook examples are available on
the author's web site:
http://www.mathcs.duq.edu/drozdek/DSinCpp/
21
BSTNode
//************************ genBST1.h **************************
//
generic binary search tree
#pragma once;
template<class T>
class BSTNode
{
public:
BSTNode()
{
left = right = 0;
}
BSTNode(const T& el, BSTNode *l = 0, BSTNode *r = 0)
{
key = el; left = l; right = r;
}
T key;
BSTNode *left, *right;
};
22
Class BST
template<class T>
class BST
{
public:
BST() {root = 0;}
~BST() {clear();}
void clear()
{
clear(root);
root = 0;
}
// Overloaded
bool isEmpty() const {return root == 0;}
void insert(const T&);
T* search(const T& el) const
{
return search(root, el);
}
// Overloaded
23
Class BST
protected:
BSTNode<T>* root;
void clear(BSTNode<T>*);
T* search(BSTNode<T>*, const T&) const;
//void preorder(BSTNode<T>*);
//void inorder(BSTNode<T>*);
//void postorder(BSTNode<T>*);
//virtual void visit(BSTNode<T>* p) {
//
cout << p->key << ' ';
//}
};
24
BST<T>::clear()
template<class T>
void BST<T>::clear(BSTNode<T> *p)
{
if (p != 0)
{
clear(p->left);
clear(p->right);
delete p;
}
}
25
BST<T>::insert()
template<class T>
void BST<T>::insert(const T& el)
{
BSTNode<T> *p = root, *prev = 0;
// find a place for inserting new node;
while (p != 0)
{
prev = p;
if (p->key < el)
{
p = p->right;
}
else
{
p = p->left;
}
}
26
BST<T>::insert()
if (root == 0)
// tree is empty;
{
root = new BSTNode<T>(el);
}
else if (prev->key < el)
{
prev->right = new BSTNode<T>(el);
}
else
{
prev->left = new BSTNode<T>(el);
}
}
27
BST<T>::search()
template<class T>
T* BST<T>::search(BSTNode<T>* p, const T& el) const
{
while (p != 0)
{
if (el == p->key)
{
return &p->key;
}
if (el < p->key)
{
p = p->left;
}
else
{
p = p->right;
}
}
return 0;
// el was not found
}
28
Test BST Template
#include <iostream>
#include "genBST1.h"
using namespace std;
int main(void)
{
cout << "This is BST_Demo\n";
BST<int> my_BST;
my_BST.insert(13);
my_BST.insert(10);
my_BST.insert(25);
my_BST.insert(2);
my_BST.insert(12);
my_BST.insert(20);
my_BST.insert(31);
my_BST.insert(29);
29
Test BST Template
cout << "Items in
for (int i = 0; i
{
int* result =
if (result !=
{
cout << i
}
}
cout << endl;
cin.get();
return 0;
the tree: ";
< 100; ++i)
my_BST.search(i);
0)
<< " ";
}
30
Test Running
End of presentation
31