#include<iostream>
#include<cstdlib>
#include<cassert>
using namespace std;
template<class T>
struct BinaryTreeNode
{
T _key;
BinaryTreeNode<T>* left;
BinaryTreeNode<T>* right;
BinaryTreeNode(const T& x)
:_key(x)
,left(NULL)
,right(NULL)
{}
};
template<class T>
class SearchBinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
SearchBinaryTree()
:_root(NULL)
{}
SearchBinaryTree(const SearchBinaryTree& t)
:_root(t._root)
{}
~ SearchBinaryTree()
{
delete _root;
}
bool Insert(T t )
{
Node* key=new Node(t);
if(_root==NULL)
_root=key;
else
{
Node* cur=_root;
Node* prev=NULL;
while(cur!=NULL)
{
if(cur->_key>key->_key)
{
prev=cur;
cur=cur->left;
}
else if(cur->_key<key->_key)
{
prev=cur;
cur=cur->right;
}
}
if(prev->_key>key->_key)
{
prev->left=key;
}
else
prev->right=key;
}
return false;
}
void Remove(const T t)
{
if(_root==NULL)
return ;
int ret= Find(t);
Node* cur=_root;
Node* prev=NULL;
if(ret==true)
{
while(cur->_key!=t&&cur)
{
if(cur->_key<t)
{
prev=cur;
cur=cur->right;
}
else if(cur->_key>t)
{
prev=cur;
cur=cur->left;
}
else
break;
}
if(cur->left==NULL&&cur->right==NULL)
{
delete cur;
}
else if(cur->left==NULL)
{
if(cur->right->_key<prev->right->_key)
{
prev->left=cur->right;
delete cur;
}
else
{
prev->right=cur->right;
}
}
else if(cur->right==NULL)
{
prev->left=cur->left;
delete cur;
}
else
{
Node* p=cur;
cur=cur->right;
while(cur->left)
{
prev=cur;
cur=cur->left;
}
p->_key=cur->_key;
delete cur;
}
}
else
cout<<"false";
}
bool Find(const T t)
{
if(_root==NULL)
return false;
Node* cur=_root;
while(cur)
{
if(cur->_key<t)
cur=cur->right;
else if(cur->_key>t)
cur=cur->left;
else
return true;
}
}
void InOrder()
{
_InOrder(_root);
cout<<endl;
}
protected:
void _InOrder(Node* root) //中序遍历
{
Node* cur=root;
if(cur==NULL)
return;
_InOrder(cur->left);
cout<<cur->_key<<" ";
_InOrder(cur->right);
}
private:
Node* _root;
#include<cstdlib>
#include<cassert>
using namespace std;
template<class T>
struct BinaryTreeNode
{
T _key;
BinaryTreeNode<T>* left;
BinaryTreeNode<T>* right;
BinaryTreeNode(const T& x)
:_key(x)
,left(NULL)
,right(NULL)
{}
};
template<class T>
class SearchBinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
SearchBinaryTree()
:_root(NULL)
{}
SearchBinaryTree(const SearchBinaryTree& t)
:_root(t._root)
{}
~ SearchBinaryTree()
{
delete _root;
}
bool Insert(T t )
{
Node* key=new Node(t);
if(_root==NULL)
_root=key;
else
{
Node* cur=_root;
Node* prev=NULL;
while(cur!=NULL)
{
if(cur->_key>key->_key)
{
prev=cur;
cur=cur->left;
}
else if(cur->_key<key->_key)
{
prev=cur;
cur=cur->right;
}
}
if(prev->_key>key->_key)
{
prev->left=key;
}
else
prev->right=key;
}
return false;
}
void Remove(const T t)
{
if(_root==NULL)
return ;
int ret= Find(t);
Node* cur=_root;
Node* prev=NULL;
if(ret==true)
{
while(cur->_key!=t&&cur)
{
if(cur->_key<t)
{
prev=cur;
cur=cur->right;
}
else if(cur->_key>t)
{
prev=cur;
cur=cur->left;
}
else
break;
}
if(cur->left==NULL&&cur->right==NULL)
{
delete cur;
}
else if(cur->left==NULL)
{
if(cur->right->_key<prev->right->_key)
{
prev->left=cur->right;
delete cur;
}
else
{
prev->right=cur->right;
}
}
else if(cur->right==NULL)
{
prev->left=cur->left;
delete cur;
}
else
{
Node* p=cur;
cur=cur->right;
while(cur->left)
{
prev=cur;
cur=cur->left;
}
p->_key=cur->_key;
delete cur;
}
}
else
cout<<"false";
}
bool Find(const T t)
{
if(_root==NULL)
return false;
Node* cur=_root;
while(cur)
{
if(cur->_key<t)
cur=cur->right;
else if(cur->_key>t)
cur=cur->left;
else
return true;
}
}
void InOrder()
{
_InOrder(_root);
cout<<endl;
}
protected:
void _InOrder(Node* root) //中序遍历
{
Node* cur=root;
if(cur==NULL)
return;
_InOrder(cur->left);
cout<<cur->_key<<" ";
_InOrder(cur->right);
}
private:
Node* _root;
};
测试
#include"SearchBinaryTree.h"
int main()
{
SearchBinaryTree<int> tree;
int ret=0;
tree.Insert(5);
tree.Insert(4);
tree.Insert(1);
tree.Insert(7);
tree.Insert(6);
tree.Insert(3);
tree.Insert(0);
ret=tree.Find(7);
tree.Remove(4);
tree.InOrder();
if(ret==true)
cout<<"find"<<endl;
else
cout<<"not find"<<endl;
system("pause");
return 0;
}