#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
|