#include
using namespace std;
template
class BST;
template
class BTnode
{
friend class BST
;
public: BTnode():leftch(NULL),rightch(NULL){}; BTnode(const T x):data(x),leftch(NULL),rightch(NULL){}; ~BTnode(){}; protected: T data; BTnode
*leftch;
BTnode
*rightch;
};
template
class BST
{
public:
BST():root(NULL){};
BST(T x);
~BST(){};
void InserT(const T da,BTnode
* &ptr);
void RemovE(const T &da,BTnode
* &ptr);
void makempty(BTnode
* &ptr);
void prints(BTnode
* ptr);//中序打印
BTnode
*FinD(const T da,BTnode
*ptr)const;
BTnode
*maxval(BTnode
*ptr)const;
BTnode
*minval(BTnode
*ptr)const;
BTnode
* &getroot(){return root;};
private:
BTnode
* root;
T Val;
};
template
BST
::BST(T x)
{
T da;
root=NULL;
Val=x;
cin>>da;
while(da!=Val)
{
InserT(da,root);
cin>>da;
}
}
template
void BST
::InserT(const T da,BTnode
* &ptr)
{
if(ptr==NULL)
{
ptr=new BTnode
(da);
if(!ptr)
{
cerr<<"No Space for a new node"<
template
BTnode
* BST
::FinD(const T da,BTnode
*ptr)const
{
if(!ptr) return NULL;
else if(da< ptr->data)
return FinD(da,ptr->leftch);
else if(da>ptr->data)
return FinD(da,ptr->rightch);
else return ptr;
}
template
BTnode
* BST
::minval(BTnode
*ptr) const
{
if(!ptr) return NULL;
while(ptr->leftch) ptr=ptr->leftch;
return ptr;
}
template
void BST
::RemovE(const T &da, BTnode
* &ptr)
{
BTnode
* temp;
if(ptr)
{
if(da
data) RemovE(da,ptr->leftch);
else if(da> ptr->data) RemovE(da,ptr->rightch);
else if(ptr->leftch && ptr->rightch)
{
temp=minval(ptr->rightch);
ptr->data=temp->data;
RemovE(ptr->data,ptr->rightch);
}
else
{
temp=ptr;
if(ptr->leftch==NULL) ptr=ptr->rightch;
else if(ptr->rightch==NULL) ptr=ptr->leftch;
delete temp;
}
}
} template
void BST
::prints(BTnode
*ptr)
{
BTnode
*temp=ptr;
if(temp!=NULL)
{
prints(temp->leftch);
cout<
data<<"/t";
prints(temp->rightch);
}
} int main() { BST
mybst(-1);//-1是输入结束标志符
BTnode
* &pt=mybst.getroot();
mybst.prints(pt);
mybst.RemovE(15,pt); cout< mybst.InserT(20,pt); cout< 示例数据:53 15 9 45 23 78 65 94 81 88 -1 |