Lewissi
04/12/2005, 23:12
g++ da hata aliyorum. neden olabilir?
asagidaki dosyalar sIrasIyla BinayNode.h BinaryNode.cpp BinaryTree.h BinaryTree.cpp BinarySearchTree.h BinarySearchTree.cpp TestBinarySearchTree.cpp
main fonksiyonu TestBinarySearchTree.cpp de.
#ifndef BINARYNODE_H_
#define BINARYNODE_H_
#include<iostream>
using namespace std;
#include<string>
/*
template <class Comparable>
class BinaryNode;
*/
/*
* int max(int &a, int &b)
{
if(a>b)
return a;
else return b;
}
*/
template <class Comparable>
class BinaryTree;
template <class Comparable>
class BinarySearchTree;
template <class Comparable>
class BinaryNode{
public:
Comparable element;
BinaryNode *left;
BinaryNode *right;
static int size(BinaryNode *t);
static int height(BinaryNode *t);
void printPostOrder();
void printInOrder();
void printPreOrder();
BinaryNode *duplicate();
BinaryNode(const Comparable & theElement = Comparable(),
BinaryNode<Comparable> *lt=NULL,BinaryNode <Comparable>*rt=NULL) {}
~BinaryNode(){}
};
#endif
#include"BinaryNode.h"
template<class Comparable>
BinaryNode<Comparable> * BinaryNode<Comparable>::duplicate()
{
BinaryNode<Comparable> *root=new BinaryNode<Comparable>(element);
if(left != NULL)
root->left=left->duplicate();
if(right != NULL)
root->right=right->duplicate();
return root;
}
template <class Comparable>
int BinaryNode<Comparable>::size(BinaryNode<Comparable> *t)
{
if(t==NULL)
return 0;
else
return 1+ size(t->left) + size(t->right);
}
template <class Comparable>
int BinaryNode<Comparable>::height(BinaryNode<Comparable> *t)
{
if(t==NULL)
return -1;
else
return 1 + max( height(t->left) + height(t->right));
}
template<class Comparable>
void BinaryNode<Comparable>::printPreOrder()
{
cout<<element<<endl;
if(left !=NULL)
left->printPreOrder();
if(right !=NULL)
right->printPreOrder();
}
template<class Comparable>
void BinaryNode<Comparable>::printPostOrder()
{
if(left !=NULL)
left->printPostOrder();
if(right !=NULL)
right->printPostOrder();
cout<<element<<endl;
}
template<class Comparable>
void BinaryNode<Comparable>::printInOrder()
{
if(left !=NULL)
left->printInOrder();
cout<<element<<endl;
if(right !=NULL)
right->printInOrder();
}
#ifndef BINARY_TREE_H_
#define BINARY_TREE_H_
#include"BinaryNode.cpp"
#include<iostream>
using namespace std;
#include<string>
// template <class Comparable>
// class BinaryNode;
template <class Comparable>
class BinaryTree
{
public:
BinaryTree():root(NULL){}
BinaryTree(const Comparable & rootItem)
:root(new Node(rootItem)){}
BinaryTree(const BinaryTree & rhs)
:root(NULL){*this = rhs;}
~BinaryTree(){
makeEmpty();
}
const BinaryTree & operator= (const BinaryTree & rhs);
void printPreOrder()
{if (root !=NULL) root->printPreOrder();}
void printInOrder()
{if (root !=NULL) root->printInOrder();}
void printPostOrder()
{if (root !=NULL) root->printPostOrder();}
void makeEmpty()
{makeEmpty(root);}
bool isEmpty()
{
return root ==NULL;
}
int size()
{return Node::size(root);}
int height()
{return Node::height(root);}
void merge(const Comparable & rootItem,BinaryTree &t1,BinaryTree &t2);
typedef BinaryNode<Comparable> Node;
Node *root;
void makeEmpty(Node * & t);
};
#endif
#include"BinaryTree.h"
template<class Comparable>
const BinaryTree<Comparable> &
BinaryTree<Comparable>::operator=(const BinaryTree<Comparable> & rhs)
{
if(this != &rhs)
{
makeEmpty();
if(rhs.root != NULL)
root = rhs.root->duplicate();
}
return *this;
}
template <class Comparable>
void BinaryTree<Comparable>::makeEmpty(BinaryNode<Comparable> * & t)
{
if( t!=NULL)
{
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
t=NULL;
}
}
#ifndef BINARY_SEARCH_TREE_H_
#define BINARY_SEARCH_TREE_H_
#include"BinaryNode.cpp"
// #include"BinaryTree.cpp"
#include <iostream> // For NULL
using namespace std;
#include<string>
// Binary node and forward declaration because g++ does
// not understand nested classes.
/* template <class Comparable>
class BinarySearchTree;
template <class Comparable>
class BinaryTree;
template <class Comparable>
*/
// BinarySearchTree class
//
// CONSTRUCTION: with ITEM_NOT_FOUND object used to signal failed finds
//
// ******************PUBLIC OPERATIONS*********************
// void insert( x ) --> Insert x
// void remove( x ) --> Remove x
// Comparable find( x ) --> Return item that matches x
// Comparable findMin( ) --> Return smallest item
// Comparable findMax( ) --> Return largest item
// boolean isEmpty( ) --> Return true if empty; else false
// void makeEmpty( ) --> Remove all items
// void printTree( ) --> Print tree in sorted order
template <class Comparable>
class BinarySearchTree
{
public:
explicit BinarySearchTree( const Comparable & notFound );
BinarySearchTree( const BinarySearchTree & rhs );
~BinarySearchTree( );
const Comparable & findMin( ) const;
const Comparable & findMax( ) const;
const Comparable & find( const Comparable & x ) const;
bool isEmpty( ) const;
void printTree( ) const;
void makeEmpty( );
void insert( const Comparable & x );
void remove( const Comparable & x );
const BinarySearchTree & operator=( const BinarySearchTree & rhs );
BinaryNode<Comparable> *root;
const Comparable ITEM_NOT_FOUND;
const Comparable & elementAt( BinaryNode<Comparable> *t ) const;
void insert( const Comparable & x, BinaryNode<Comparable> * & t ) const;
void remove( const Comparable & x, BinaryNode<Comparable> * & t ) const;
BinaryNode<Comparable> * findMin( BinaryNode<Comparable> *t ) const;
BinaryNode<Comparable> * findMax( BinaryNode<Comparable> *t ) const;
BinaryNode<Comparable> * find( const Comparable & x, BinaryNode<Comparable> *t ) const;
void makeEmpty( BinaryNode<Comparable> * & t ) const;
void printTree( BinaryNode<Comparable> *t ) const;
BinaryNode<Comparable> * clone( BinaryNode<Comparable> *t ) const;
};
#endif
#include "BinarySearchTree.h"
/**
* Implements an unbalanced binary search tree.
* Note that all "matching" is based on the < method.
*/
/**
* Construct the tree.
*/
template <class Comparable>
BinarySearchTree<Comparable>::BinarySearchTree( const Comparable & notFound ) :
root( NULL ), ITEM_NOT_FOUND( notFound )
{
}
/**
* Copy constructor.
*/
template <class Comparable>
BinarySearchTree<Comparable>::
BinarySearchTree( const BinarySearchTree<Comparable> & rhs ) :
root( NULL ), ITEM_NOT_FOUND( rhs.ITEM_NOT_FOUND )
{
*this = rhs;
}
/**
* Destructor for the tree.
*/
template <class Comparable>
BinarySearchTree<Comparable>::~BinarySearchTree( )
{
makeEmpty( );
}
/**
* Insert x into the tree; duplicates are ignored.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::insert( const Comparable & x )
{
insert( x, root );
}
/**
* Remove x from the tree. Nothing is done if x is not found.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::remove( const Comparable & x )
{
remove( x, root );
}
/**
* Find the smallest item in the tree.
* Return smallest item or ITEM_NOT_FOUND if empty.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::findMin( ) const
{
return elementAt( findMin( root ) );
}
/**
* Find the largest item in the tree.
* Return the largest item of ITEM_NOT_FOUND if empty.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::findMax( ) const
{
return elementAt( findMax( root ) );
}
/**
* Find item x in the tree.
* Return the matching item or ITEM_NOT_FOUND if not found.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::
find( const Comparable & x ) const
{
return elementAt( find( x, root ) );
}
/**
* Make the tree logically empty.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::makeEmpty( )
{
makeEmpty( root );
}
/**
* Test if the tree is logically empty.
* Return true if empty, false otherwise.
*/
template <class Comparable>
bool BinarySearchTree<Comparable>::isEmpty( ) const
{
return root == NULL;
}
/**
* Print the tree contents in sorted order.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::printTree( ) const
{
if( isEmpty( ) )
cout << "Empty tree" << endl;
else
printTree( root );
}
/*
// added
//print preorder
template <class Comparable>
void BinarySearchTree<Comparable>::printpre( ) const
{
if( isEmpty( ) )
cout << "Empty tree" << endl;
else
printpre( root );
}
//
*/
/**
* Deep copy.
*/
template <class Comparable>
const BinarySearchTree<Comparable> &
BinarySearchTree<Comparable>::
operator=( const BinarySearchTree<Comparable> & rhs )
{
if( this != &rhs )
{
makeEmpty( );
root = clone( rhs.root );
}
return *this;
}
/**
* Internal method to get element field in node t.
* Return the element field or ITEM_NOT_FOUND if t is NULL.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::
elementAt( BinaryNode<Comparable> *t ) const
{
if( t == NULL )
return ITEM_NOT_FOUND;
else
return t->element;
}
/**
* Internal method to insert into a subtree.
* x is the item to insert.
* t is the node that roots the tree.
* Set the new root.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::
insert( const Comparable & x, BinaryNode<Comparable> * & t ) const
{
if( t == NULL )
t = new BinaryNode<Comparable>( x, NULL, NULL );
else if( x < t->element )
insert( x, t->left );
else if( t->element < x )
insert( x, t->right );
else
; // Duplicate; do nothing
}
/**
* Internal method to remove from a subtree.
* x is the item to remove.
* t is the node that roots the tree.
* Set the new root.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::
remove( const Comparable & x, BinaryNode<Comparable> * & t ) const
{
if( t == NULL )
return; // Item not found; do nothing
if( x < t->element )
remove( x, t->left );
else if( t->element < x )
remove( x, t->right );
else if( t->left != NULL && t->right != NULL ) // Two children
{
t->element = findMin( t->right )->element;
remove( t->element, t->right );
}
else
{
BinaryNode<Comparable> *oldNode = t;
t = ( t->left != NULL ) ? t->left : t->right;
delete oldNode;
}
}
/**
* Internal method to find the smallest item in a subtree t.
* Return node containing the smallest item.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::findMin( BinaryNode<Comparable> *t ) const
{
if( t == NULL )
return NULL;
if( t->left == NULL )
return t;
return findMin( t->left );
}
/**
* Internal method to find the largest item in a subtree t.
* Return node containing the largest item.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::findMax( BinaryNode<Comparable> *t ) const
{
if( t != NULL )
while( t->right != NULL )
t = t->right;
return t;
}
/**
* Internal method to find an item in a subtree.
* x is item to search for.
* t is the node that roots the tree.
* Return node containing the matched item.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::
find( const Comparable & x, BinaryNode<Comparable> *t ) const
{
if( t == NULL )
return NULL;
else if( x < t->element )
return find( x, t->left );
else if( t->element < x )
return find( x, t->right );
else
return t; // Match
}
/**
* Internal method to make subtree empty.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::
makeEmpty( BinaryNode<Comparable> * & t ) const
{
if( t != NULL )
{
makeEmpty( t->left );
makeEmpty( t->right );
delete t;
}
t = NULL;
}
/**
* Internal method to print a subtree rooted at t in sorted order.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::printTree( BinaryNode<Comparable> *t ) const
{
if( t != NULL )
{
cout << t->element << endl;
printTree( t->left );
// cout << t->element << endl;
printTree( t->right );
}
}
/*
//////////////////////////////////////// added
template <class Comparable>
void BinarySearchTree<Comparable>::printpre( BinaryNode<Comparable> *t ) const
{
if( t != NULL )
{
cout << t->element << endl;
printpre( t->left );
printpre( t->right );
}
}
/////////////////////////////////
*/
/**
* Internal method to clone subtree.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::clone( BinaryNode<Comparable> * t ) const
{
if( t == NULL )
return NULL;
else
return new BinaryNode<Comparable>( t->element, clone( t->left ), clone( t->right ) );
}
#include "BinarySearchTree.cpp"
// Test program
int main( )
{
const int ITEM_NOT_FOUND = -9999;
BinarySearchTree<int> t( ITEM_NOT_FOUND );
int NUMS = 4000;
const int GAP = 37;
int i;
/*
// added
BinarySearchTree<int> deneme(20);
deneme.insert(12);
deneme.insert(-21);
deneme.insert(-44);
deneme.insert(22);
deneme.insert(24);
deneme.insert(23);
deneme.insert(14);
deneme.printTree();
cout<<" "<<endl;
cout<<deneme.find(12)<<endl;
cout<<deneme.findMin()<<endl;
cout<<deneme.findMax()<<endl;
*/
//
cout << "Checking... (no more output means success)" << endl;
for( i = GAP; i != 0; i = ( i + GAP ) % NUMS )
t.insert( i );
for( i = 1; i < NUMS; i+= 2 )
t.remove( i );
if( NUMS < 40 )
t.printTree( );
if( t.findMin( ) != 2 || t.findMax( ) != NUMS - 2 )
cout << "FindMin or FindMax error!" << endl;
for( i = 2; i < NUMS; i+=2 )
if( t.find( i ) != i )
cout << "Find error1!" << endl;
for( i = 1; i < NUMS; i+=2 )
{
if( t.find( i ) != ITEM_NOT_FOUND )
cout << "Find error2!" << endl;
}
BinarySearchTree<int> t2( ITEM_NOT_FOUND );
t2 = t;
for( i = 2; i < NUMS; i+=2 )
if( t2.find( i ) != i )
cout << "Find error1!" << endl;
for( i = 1; i < NUMS; i+=2 )
{
if( t2.find( i ) != ITEM_NOT_FOUND )
cout << "Find error2!" << endl;
}
return 0;
}
asagidaki dosyalar sIrasIyla BinayNode.h BinaryNode.cpp BinaryTree.h BinaryTree.cpp BinarySearchTree.h BinarySearchTree.cpp TestBinarySearchTree.cpp
main fonksiyonu TestBinarySearchTree.cpp de.
#ifndef BINARYNODE_H_
#define BINARYNODE_H_
#include<iostream>
using namespace std;
#include<string>
/*
template <class Comparable>
class BinaryNode;
*/
/*
* int max(int &a, int &b)
{
if(a>b)
return a;
else return b;
}
*/
template <class Comparable>
class BinaryTree;
template <class Comparable>
class BinarySearchTree;
template <class Comparable>
class BinaryNode{
public:
Comparable element;
BinaryNode *left;
BinaryNode *right;
static int size(BinaryNode *t);
static int height(BinaryNode *t);
void printPostOrder();
void printInOrder();
void printPreOrder();
BinaryNode *duplicate();
BinaryNode(const Comparable & theElement = Comparable(),
BinaryNode<Comparable> *lt=NULL,BinaryNode <Comparable>*rt=NULL) {}
~BinaryNode(){}
};
#endif
#include"BinaryNode.h"
template<class Comparable>
BinaryNode<Comparable> * BinaryNode<Comparable>::duplicate()
{
BinaryNode<Comparable> *root=new BinaryNode<Comparable>(element);
if(left != NULL)
root->left=left->duplicate();
if(right != NULL)
root->right=right->duplicate();
return root;
}
template <class Comparable>
int BinaryNode<Comparable>::size(BinaryNode<Comparable> *t)
{
if(t==NULL)
return 0;
else
return 1+ size(t->left) + size(t->right);
}
template <class Comparable>
int BinaryNode<Comparable>::height(BinaryNode<Comparable> *t)
{
if(t==NULL)
return -1;
else
return 1 + max( height(t->left) + height(t->right));
}
template<class Comparable>
void BinaryNode<Comparable>::printPreOrder()
{
cout<<element<<endl;
if(left !=NULL)
left->printPreOrder();
if(right !=NULL)
right->printPreOrder();
}
template<class Comparable>
void BinaryNode<Comparable>::printPostOrder()
{
if(left !=NULL)
left->printPostOrder();
if(right !=NULL)
right->printPostOrder();
cout<<element<<endl;
}
template<class Comparable>
void BinaryNode<Comparable>::printInOrder()
{
if(left !=NULL)
left->printInOrder();
cout<<element<<endl;
if(right !=NULL)
right->printInOrder();
}
#ifndef BINARY_TREE_H_
#define BINARY_TREE_H_
#include"BinaryNode.cpp"
#include<iostream>
using namespace std;
#include<string>
// template <class Comparable>
// class BinaryNode;
template <class Comparable>
class BinaryTree
{
public:
BinaryTree():root(NULL){}
BinaryTree(const Comparable & rootItem)
:root(new Node(rootItem)){}
BinaryTree(const BinaryTree & rhs)
:root(NULL){*this = rhs;}
~BinaryTree(){
makeEmpty();
}
const BinaryTree & operator= (const BinaryTree & rhs);
void printPreOrder()
{if (root !=NULL) root->printPreOrder();}
void printInOrder()
{if (root !=NULL) root->printInOrder();}
void printPostOrder()
{if (root !=NULL) root->printPostOrder();}
void makeEmpty()
{makeEmpty(root);}
bool isEmpty()
{
return root ==NULL;
}
int size()
{return Node::size(root);}
int height()
{return Node::height(root);}
void merge(const Comparable & rootItem,BinaryTree &t1,BinaryTree &t2);
typedef BinaryNode<Comparable> Node;
Node *root;
void makeEmpty(Node * & t);
};
#endif
#include"BinaryTree.h"
template<class Comparable>
const BinaryTree<Comparable> &
BinaryTree<Comparable>::operator=(const BinaryTree<Comparable> & rhs)
{
if(this != &rhs)
{
makeEmpty();
if(rhs.root != NULL)
root = rhs.root->duplicate();
}
return *this;
}
template <class Comparable>
void BinaryTree<Comparable>::makeEmpty(BinaryNode<Comparable> * & t)
{
if( t!=NULL)
{
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
t=NULL;
}
}
#ifndef BINARY_SEARCH_TREE_H_
#define BINARY_SEARCH_TREE_H_
#include"BinaryNode.cpp"
// #include"BinaryTree.cpp"
#include <iostream> // For NULL
using namespace std;
#include<string>
// Binary node and forward declaration because g++ does
// not understand nested classes.
/* template <class Comparable>
class BinarySearchTree;
template <class Comparable>
class BinaryTree;
template <class Comparable>
*/
// BinarySearchTree class
//
// CONSTRUCTION: with ITEM_NOT_FOUND object used to signal failed finds
//
// ******************PUBLIC OPERATIONS*********************
// void insert( x ) --> Insert x
// void remove( x ) --> Remove x
// Comparable find( x ) --> Return item that matches x
// Comparable findMin( ) --> Return smallest item
// Comparable findMax( ) --> Return largest item
// boolean isEmpty( ) --> Return true if empty; else false
// void makeEmpty( ) --> Remove all items
// void printTree( ) --> Print tree in sorted order
template <class Comparable>
class BinarySearchTree
{
public:
explicit BinarySearchTree( const Comparable & notFound );
BinarySearchTree( const BinarySearchTree & rhs );
~BinarySearchTree( );
const Comparable & findMin( ) const;
const Comparable & findMax( ) const;
const Comparable & find( const Comparable & x ) const;
bool isEmpty( ) const;
void printTree( ) const;
void makeEmpty( );
void insert( const Comparable & x );
void remove( const Comparable & x );
const BinarySearchTree & operator=( const BinarySearchTree & rhs );
BinaryNode<Comparable> *root;
const Comparable ITEM_NOT_FOUND;
const Comparable & elementAt( BinaryNode<Comparable> *t ) const;
void insert( const Comparable & x, BinaryNode<Comparable> * & t ) const;
void remove( const Comparable & x, BinaryNode<Comparable> * & t ) const;
BinaryNode<Comparable> * findMin( BinaryNode<Comparable> *t ) const;
BinaryNode<Comparable> * findMax( BinaryNode<Comparable> *t ) const;
BinaryNode<Comparable> * find( const Comparable & x, BinaryNode<Comparable> *t ) const;
void makeEmpty( BinaryNode<Comparable> * & t ) const;
void printTree( BinaryNode<Comparable> *t ) const;
BinaryNode<Comparable> * clone( BinaryNode<Comparable> *t ) const;
};
#endif
#include "BinarySearchTree.h"
/**
* Implements an unbalanced binary search tree.
* Note that all "matching" is based on the < method.
*/
/**
* Construct the tree.
*/
template <class Comparable>
BinarySearchTree<Comparable>::BinarySearchTree( const Comparable & notFound ) :
root( NULL ), ITEM_NOT_FOUND( notFound )
{
}
/**
* Copy constructor.
*/
template <class Comparable>
BinarySearchTree<Comparable>::
BinarySearchTree( const BinarySearchTree<Comparable> & rhs ) :
root( NULL ), ITEM_NOT_FOUND( rhs.ITEM_NOT_FOUND )
{
*this = rhs;
}
/**
* Destructor for the tree.
*/
template <class Comparable>
BinarySearchTree<Comparable>::~BinarySearchTree( )
{
makeEmpty( );
}
/**
* Insert x into the tree; duplicates are ignored.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::insert( const Comparable & x )
{
insert( x, root );
}
/**
* Remove x from the tree. Nothing is done if x is not found.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::remove( const Comparable & x )
{
remove( x, root );
}
/**
* Find the smallest item in the tree.
* Return smallest item or ITEM_NOT_FOUND if empty.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::findMin( ) const
{
return elementAt( findMin( root ) );
}
/**
* Find the largest item in the tree.
* Return the largest item of ITEM_NOT_FOUND if empty.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::findMax( ) const
{
return elementAt( findMax( root ) );
}
/**
* Find item x in the tree.
* Return the matching item or ITEM_NOT_FOUND if not found.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::
find( const Comparable & x ) const
{
return elementAt( find( x, root ) );
}
/**
* Make the tree logically empty.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::makeEmpty( )
{
makeEmpty( root );
}
/**
* Test if the tree is logically empty.
* Return true if empty, false otherwise.
*/
template <class Comparable>
bool BinarySearchTree<Comparable>::isEmpty( ) const
{
return root == NULL;
}
/**
* Print the tree contents in sorted order.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::printTree( ) const
{
if( isEmpty( ) )
cout << "Empty tree" << endl;
else
printTree( root );
}
/*
// added
//print preorder
template <class Comparable>
void BinarySearchTree<Comparable>::printpre( ) const
{
if( isEmpty( ) )
cout << "Empty tree" << endl;
else
printpre( root );
}
//
*/
/**
* Deep copy.
*/
template <class Comparable>
const BinarySearchTree<Comparable> &
BinarySearchTree<Comparable>::
operator=( const BinarySearchTree<Comparable> & rhs )
{
if( this != &rhs )
{
makeEmpty( );
root = clone( rhs.root );
}
return *this;
}
/**
* Internal method to get element field in node t.
* Return the element field or ITEM_NOT_FOUND if t is NULL.
*/
template <class Comparable>
const Comparable & BinarySearchTree<Comparable>::
elementAt( BinaryNode<Comparable> *t ) const
{
if( t == NULL )
return ITEM_NOT_FOUND;
else
return t->element;
}
/**
* Internal method to insert into a subtree.
* x is the item to insert.
* t is the node that roots the tree.
* Set the new root.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::
insert( const Comparable & x, BinaryNode<Comparable> * & t ) const
{
if( t == NULL )
t = new BinaryNode<Comparable>( x, NULL, NULL );
else if( x < t->element )
insert( x, t->left );
else if( t->element < x )
insert( x, t->right );
else
; // Duplicate; do nothing
}
/**
* Internal method to remove from a subtree.
* x is the item to remove.
* t is the node that roots the tree.
* Set the new root.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::
remove( const Comparable & x, BinaryNode<Comparable> * & t ) const
{
if( t == NULL )
return; // Item not found; do nothing
if( x < t->element )
remove( x, t->left );
else if( t->element < x )
remove( x, t->right );
else if( t->left != NULL && t->right != NULL ) // Two children
{
t->element = findMin( t->right )->element;
remove( t->element, t->right );
}
else
{
BinaryNode<Comparable> *oldNode = t;
t = ( t->left != NULL ) ? t->left : t->right;
delete oldNode;
}
}
/**
* Internal method to find the smallest item in a subtree t.
* Return node containing the smallest item.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::findMin( BinaryNode<Comparable> *t ) const
{
if( t == NULL )
return NULL;
if( t->left == NULL )
return t;
return findMin( t->left );
}
/**
* Internal method to find the largest item in a subtree t.
* Return node containing the largest item.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::findMax( BinaryNode<Comparable> *t ) const
{
if( t != NULL )
while( t->right != NULL )
t = t->right;
return t;
}
/**
* Internal method to find an item in a subtree.
* x is item to search for.
* t is the node that roots the tree.
* Return node containing the matched item.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::
find( const Comparable & x, BinaryNode<Comparable> *t ) const
{
if( t == NULL )
return NULL;
else if( x < t->element )
return find( x, t->left );
else if( t->element < x )
return find( x, t->right );
else
return t; // Match
}
/**
* Internal method to make subtree empty.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::
makeEmpty( BinaryNode<Comparable> * & t ) const
{
if( t != NULL )
{
makeEmpty( t->left );
makeEmpty( t->right );
delete t;
}
t = NULL;
}
/**
* Internal method to print a subtree rooted at t in sorted order.
*/
template <class Comparable>
void BinarySearchTree<Comparable>::printTree( BinaryNode<Comparable> *t ) const
{
if( t != NULL )
{
cout << t->element << endl;
printTree( t->left );
// cout << t->element << endl;
printTree( t->right );
}
}
/*
//////////////////////////////////////// added
template <class Comparable>
void BinarySearchTree<Comparable>::printpre( BinaryNode<Comparable> *t ) const
{
if( t != NULL )
{
cout << t->element << endl;
printpre( t->left );
printpre( t->right );
}
}
/////////////////////////////////
*/
/**
* Internal method to clone subtree.
*/
template <class Comparable>
BinaryNode<Comparable> *
BinarySearchTree<Comparable>::clone( BinaryNode<Comparable> * t ) const
{
if( t == NULL )
return NULL;
else
return new BinaryNode<Comparable>( t->element, clone( t->left ), clone( t->right ) );
}
#include "BinarySearchTree.cpp"
// Test program
int main( )
{
const int ITEM_NOT_FOUND = -9999;
BinarySearchTree<int> t( ITEM_NOT_FOUND );
int NUMS = 4000;
const int GAP = 37;
int i;
/*
// added
BinarySearchTree<int> deneme(20);
deneme.insert(12);
deneme.insert(-21);
deneme.insert(-44);
deneme.insert(22);
deneme.insert(24);
deneme.insert(23);
deneme.insert(14);
deneme.printTree();
cout<<" "<<endl;
cout<<deneme.find(12)<<endl;
cout<<deneme.findMin()<<endl;
cout<<deneme.findMax()<<endl;
*/
//
cout << "Checking... (no more output means success)" << endl;
for( i = GAP; i != 0; i = ( i + GAP ) % NUMS )
t.insert( i );
for( i = 1; i < NUMS; i+= 2 )
t.remove( i );
if( NUMS < 40 )
t.printTree( );
if( t.findMin( ) != 2 || t.findMax( ) != NUMS - 2 )
cout << "FindMin or FindMax error!" << endl;
for( i = 2; i < NUMS; i+=2 )
if( t.find( i ) != i )
cout << "Find error1!" << endl;
for( i = 1; i < NUMS; i+=2 )
{
if( t.find( i ) != ITEM_NOT_FOUND )
cout << "Find error2!" << endl;
}
BinarySearchTree<int> t2( ITEM_NOT_FOUND );
t2 = t;
for( i = 2; i < NUMS; i+=2 )
if( t2.find( i ) != i )
cout << "Find error1!" << endl;
for( i = 1; i < NUMS; i+=2 )
{
if( t2.find( i ) != ITEM_NOT_FOUND )
cout << "Find error2!" << endl;
}
return 0;
}