Cant see any problems (except initialisation):
#ifndef BINARYTREE_H_
#define BINARYTREE_H_
enum ORDER_MODEL{
ORDER_MODEL_PREV = 0,
ORDER_MODEL_IN,
ORDER_MODEL_POST
};
template<typename T>
struct treeNode
{
T date;
treeNode<T>* parent,
* left,
* right;
treeNode(T& d):date(d){ parent=left=right=0; }
treeNode(T& d,treeNode<T>* p):date(d),parent(p){ parent=left=right=0; }
treeNode(T& d,treeNode<T>* p,treeNode<T>* l,treeNode<T>* r):
date(d),parent(p),left(l),right(r){ parent=left=right=0; }
bool operator<(treeNode<T> &node)
{
return date < node.date;
}
bool operator>(treeNode<T> &node)
{
return date > node.date;
}
bool operator==(treeNode<T> &node)
{
return date == node.date;
}
};
template<typename T>
class BinaryTree
{
private:
treeNode<T>* root;
int theSize;
treeNode<T>* tree_search(treeNode<T>* node,const T& key) const;
treeNode<T>* tree_minim(const treeNode<T>* node) const;
treeNode<T>* tree_maxm(const treeNode<T>* node) const;
void tree_remove(treeNode<T>* node,T& key);
void destroy(treeNode<T>* node);
void print_tree_prev(treeNode<T>*)const;
void print_tree_in(treeNode<T>*)const;
void print_tree_post(treeNode<T>*)const;
public:
BinaryTree();
~BinaryTree();
int size();
treeNode<T>* tree_search(T key)
{
return tree_search(root,key);
}
T& tree_minimum()
{
return tree_minim(root).date;
}
T& tree_maxmum()
{
return tree_maxm(root).date;
}
treeNode<T>* tree_sucessor(const treeNode<T>* node)const;
treeNode<T>* tree_precessor(const treeNode<T>* node)const;
void insert(const T& key);
void remove(T& key);
void makeEmpty();
void print_tree(ORDER_MODEL model)const;
};
#endif /* BINARYTREE_H_ */
#include <iostream>
#include <string>
using namespace std;
template<typename T>
BinaryTree<T>::BinaryTree():root(NULL),theSize(0){}
template<typename T>
BinaryTree<T>::~BinaryTree()
{
destroy(root);
}
template<typename T>
void BinaryTree<T>::destroy(treeNode<T>* node)
{
if(node != NULL)
{
destroy(node->left);
destroy(node->right);
delete node;
}
node = NULL;
}
template<typename T>
int BinaryTree<T>::size()
{
return theSize;
}
template<typename T>
treeNode<T>* BinaryTree<T>::tree_search(treeNode<T>* node,const T& key)const
{
while(node!=NULL && key != node->date)
{
if(key < node->date)
{
node = node->left;
node = node->right;
}
}
return node;
}
template<typename T>
treeNode<T>* BinaryTree<T>::tree_maxm(const treeNode<T>* node)const
{
while(node->right!=NULL)
{
node = node->right;
}
return node;
}
template<typename T>
treeNode<T>* BinaryTree<T>::tree_minim(const treeNode<T>* node) const
{
while(node->left!=NULL)
{
node = node->left;
}
return node;
}
template<typename T>
treeNode<T>* BinaryTree<T>::tree_sucessor(const treeNode<T>* node)const
{
if(node==NULL)
{
return NULL;
}
else if(node.right!=NULL)
{
return tree_minim(node->right);
}
treeNode<T>* p = node.parent;
while(p!=NULL && p->right = node)
{
node = p;
p = p.parent;
}
return p;
}
template<typename T>
treeNode<T>* BinaryTree<T>::tree_precessor(const treeNode<T>* node)const
{
if(node==NULL)
{
return NULL;
}
else if(node->left != NULL)
{
return tree_maxm(node->left);
}
treeNode<T>* p = node->parent;
while(p!=NULL && p->left = node)
{
node = p;
p = p->parent;
}
return p;
}
template<typename T>
void BinaryTree<T>::makeEmpty(){
destroy(root);
}
template<typename T>
void BinaryTree<T>::insert(const T& key)
{
treeNode<T>* y = NULL;
treeNode<T>* z = new treeNode<T>((T&)key);
treeNode<T>* node = root;
while(node!=NULL)
{
y = node;
if(z->date < node->date)
{
node = node->left;
}
else
{
node = node->right;
}
}
z->parent = y;
if(y == NULL)
{
root = z;
}
else if(z->date < y->date)
{
y->left = z;
}
else
{
y->right = z;
}
theSize++;
}
template<typename T>
void BinaryTree<T>::remove(T& key)
{
tree_remove(root,key);
}
template<typename T>
void BinaryTree<T>::tree_remove(treeNode<T>* node,T& key)
{
treeNode<T>* z = tree_search(key);
if(z==NULL)
return;
treeNode<T>* y = NULL;
treeNode<T>* x = NULL;
if(z->left == NULL || z->right == NULL)
{
y = z;
}
else
{
y = tree_sucessor(z);
}
if(y->left!=NULL)
{
x = y->left;
}
else
{
x = y->right;
}
if(x!=NULL)
{
x->parent = y->parent;
}
if(y->parent == NULL)
{
root = x;
}
else if(y == y->parent->left)
{
y->parent->left = x;
}
else
{
y->parent->right = x;
}
if(y!=z)
{
z->date = y->date;
}
theSize--;
}
template<typename T>
void BinaryTree<T>::print_tree(ORDER_MODEL model)const
{
if(model == ORDER_MODEL_PREV)
{
print_tree_prev(root);
}
else if(model == ORDER_MODEL_IN)
{
print_tree_in(root);
}
else
{
print_tree_post(root);
}
}
template<typename T>
void BinaryTree<T>::print_tree_in(treeNode<T>* node)const
{
if(node!=NULL)
{
cout << "[";
print_tree_in(node->left);
cout << node->date << ",";
print_tree_in(node->right);
cout << "]";
}
}
template<typename T>
void BinaryTree<T>::print_tree_prev(treeNode<T>* node)const
{
if(node!=NULL)
{
cout << "[";
cout << node->date << ",";
print_tree_in(node->left);
print_tree_in(node->right);
cout << "]";
}
}
template<typename T>
void BinaryTree<T>::print_tree_post(treeNode<T>* node)const
{
if(node!=NULL)
{
cout << "[";
print_tree_in(node->left);
print_tree_in(node->right);
cout << node->date << ",";
cout << "]";
}
}
int main()
{
BinaryTree<int> bt;
#if(0)
cout << "ok~" << endl;
cout << "1" << endl;
bt.insert(5);
bt.insert(7);
cout << "2" << endl;
bt.insert(9);
cout << "ok?" << endl;
#else
srand(42);
for(int i=0;i<100;i++)
bt.insert(rand());
#endif
bt.print_tree(ORDER_MODEL_PREV);
_gettch();
return 0;
}
Good luck.