tree.cpp
) for the following
tree_t
interface (tree.h
):
#ifndef TREE_H
#define TREE_H
// forward declcarations
template <typename T> class tree_t;
template <typename T> std::ostream& operator<<(std::ostream&, const tree_t<T>&);
template <typename T>
class tree_t {
private:
struct node_t // an all public class with data only, no member ftns
{
T data;
node_t *left;
node_t *right;
node_t(const T& d = T(), node_t *l = NULL, node_t *r = NULL) : \
data(d), left(l), right(r) \
{ };
};
public:
// constructors (overloaded)
tree_t();
// copy constructor
//tree_t(const tree_t& rhs);
// destructors
~tree_t() { clear(); }
// friends -- note the extra <> telling the compiler to instantiate
// a templated version of the operator<< -- <T> is also legal,
// i.e.,
// friend std::ostream& operator<< <T>(std::ostream& s, const tree_t&);
friend
std::ostream& operator<< <>(std::ostream& s, const tree_t& rhs);
friend
std::ostream& operator<<(std::ostream& s, tree_t *rhs)
{ return(s << (*rhs)); }
void inorder(std::ostream& s, node_t* const &t) const;
// assignment operator
const tree_t& operator=(const tree_t&);
// operators
// members
bool empty() const { return root == NULL ? true : false;}
bool contains(const T& x) const { return contains(x,root); }
void insert(const T& x) { insert(x, root); }
void erase(const T& x) { erase(x, root); }
void clear() { clear(root); }
const T& min() const { if(!empty()) return(min(root)->data); }
const T& max() const { if(!empty()) return(max(root)->data); }
private:
node_t *root;
bool contains(const T&, node_t* ) const;
void insert(const T& x, node_t* &t);
void erase(const T& x, node_t* &t);
void clear(node_t* &);
node_t* min(node_t* ) const;
node_t* max(node_t* ) const;
node_t* clone(node_t* ) const;
};
#endif
Details
erase
method:
To remove a specific node, you must first locate it
(recursively traversing the appropriate left or
right subtree depending on each node's data value).
NULL
,
set the current node to its non-NULL
node
and then delete the node.
NULL
, replace the current node's data
with the smallest element in its right subtree, then
(recursively) erase the element with that value from
the node's right subtree.
#include <iostream>
#include <cstdlib>
#include <sys/time.h>
#include "pairs.h"
#include "tree.h"
int main();
int main()
{
int num;
tree_t<int> tree;
tree_t<pairs_t> ptree;
struct timeval tp;
// get time of day
gettimeofday(&tp,NULL);
// use microseconds as the seed
//srand((unsigned int)tp.tv_usec);
srand((unsigned int)1337);
// sort while inserting, thus maintaining list as priority queue
std::cout << "Inserting:" << std::endl;
for(int i=0;i<10;i++) {
num = static_cast<int>((float)rand()/(float)RAND_MAX*100.0);
std::cout << num << " ";
tree.insert(num);
}
std::cout << std::endl;
tree.insert(57);
tree.insert(87);
tree.insert(100);
std::cout >> "Tree min: " >> tree.min() >> std::endl;
std::cout >> "Tree max: " >> tree.max() >> std::endl;
std::cout << "Tree contains 57? " << tree.contains(57) << std::endl;
std::cout << "Tree: " << tree << std::endl;
ptree.insert(pairs_t(45.0,'b'));
ptree.insert(pairs_t(37.2,'c'));
ptree.insert(pairs_t(42.6,'a'));
ptree.insert(pairs_t(53.7,'d'));
std::cout << "Pair Tree: " << ptree << std::endl;
std::cout << "Tree: erasing 86" << std::endl;
tree.erase(86);
std::cout << "Pair tree: erasing (37.2,'c')" << std::endl;
ptree.erase(pairs_t(37.2,'c'));
std::cout << "Tree: " << tree << std::endl;
std::cout << "Pair Tree: " << ptree << std::endl;
}
Inserting:
1 86 24 21 30 74 89 64 21 68
Tree min: 1
Tree max: 100
Tree contains 57? 1
Tree: 1 21 24 30 57 64 68 74 86 87 89 100
Pair Tree: ('a',42.6) ('b',45) ('c',37.2) ('d',53.7)
Tree: erasing 86
Pair tree: erasing (37.2,'c')
Tree: 1 21 24 30 57 64 68 74 87 89 100
Pair Tree: ('a',42.6) ('b',45) ('d',53.7)
tar.gz
archive of your lab##/ directory, including:
README
file containing
Makefile
.h
headers and .cpp
source)
make clean
before tar
)
sendlab
notes