- //BSTree.h
- #include<iostream>
- using namespace std;
- template<typename Elem>
- struct BSTNode //implement BST's node
- {
- BSTNode *left,*right;
- Elem data;
- BSTNode(Elem dataVal,BSTNode* leftVal=0,BSTNode* rightVal=0)
- {
- data = dataVal, left = leftVal, right = rightVal;
- }
- BSTNode(BSTNode* leftVal=0,BSTNode* rightVal=0)
- {
- left = leftVal, right = rightVal;
- }
- BSTNode *GetLeft(){return left;}
- BSTNode *GetRight(){return right;}
- Elem GetData(){return data;}
- void SetData(Elem it){data = it;}
- void SetLeft(BSTNode<Elem>*l){left = l;}
- void SetRight(BSTNode<Elem>*r){right = r;}
- };
- template<typename Elem>
- class BSTree //implement BST
- {
- BSTNode<Elem>* root;
- public:
- BSTree(Elem it){Init(it);}
- ~BSTree(){DeleteTree(root);}
- void Init(Elem);
- void InsertNode(BSTNode<Elem>*,Elem Item);
- void DeleteTree(BSTNode<Elem>*);
- void PreOrder(BSTNode<Elem>*);
- void InOrder(BSTNode<Elem>*);
- void PostOrder(BSTNode<Elem>*);
- bool Find(BSTNode<Elem>*,Elem);
- BSTNode<Elem>* GetRoot(){return root;}
- };
- //////////////////////////////////////////////////////////////////////
- //BSTree.cpp
- #include "BSTree.h"
- template<typename Elem>
- void BSTree<Elem>::Init(Elem item)
- {
- root = new BSTNode<Elem>(item,0,0);
- }
- template<typename Elem>
- void BSTree<Elem>::DeleteTree(BSTNode<Elem>* T)
- {
- if (T != NULL)
- {
- DeleteTree(T->GetLeft());
- DeleteTree(T->GetRight());
- delete T;
- }
- }
- template<typename Elem>
- void BSTree<Elem>::InsertNode(BSTNode<Elem>* T,Elem item)
- {
- BSTNode<Elem>* p = 0;
- if (T == NULL)
- {
- Init(item);return ;
- }
- else p = T;
- while (1)
- {
- if (p->GetData() == item) return ;
- else if (p->GetData() > item)
- {
- if (p->GetLeft() == NULL)
- {
- p->left = new BSTNode<Elem>(item,0,0);
- return ;
- }
- else p = p->left;
- }
- else
- {
- if (p->GetRight() == NULL)
- {
- p->right = new BSTNode<Elem>(item,0,0);
- return ;
- }
- else p = p->right;
- }
- }
- }
- template<typename Elem>
- void BSTree<Elem>::PreOrder(BSTNode<Elem>* T)
- {
- if (T != NULL)
- {
- cout<<T->GetData()<<" ";
- PreOrder(T->GetLeft());
- PreOrder(T->GetRight());
- }
- }
- template<typename Elem>
- void BSTree<Elem>::InOrder(BSTNode<Elem>* T)
- {
- if (T != NULL)
- {
- InOrder(T->left);
- cout<<T->data<<" ";
- InOrder(T->right);
- }
- }
- template<typename Elem>
- void BSTree<Elem>::PostOrder(BSTNode<Elem>* T)
- {
- if( T != NULL)
- {
- PostOrder(T->left);
- PostOrder(T->right);
- cout<<T->data<<" ";
- }
- }
- template<typename Elem>
- bool BSTree<Elem>::Find(BSTNode<Elem>* T,Elem item)
- {
- if (T == NULL) return false;
- else if (T->GetData() > item) return Find(T->left,item);
- else if (T->GetData() < item) return Find(T->right,item);
- else
- {
- item = T->GetData();
- return true;
- }
- }
- ////////////////////////////////////////////////////////////
- //main.cpp
- #include "BSTree.cpp"
- int main(void)
- {
- BSTree<char> BSt('a'); //root node
- BSTNode<char>* BSn;
- BSn = BSt.GetRoot();
- cout<<"Insert number in the tree,terminted when you type '*'"<<endl;
- char item;
- cin>>item;
- while (item != '*')
- {
- BSt.InsertNode(BSn,item);
- cin>>item;
- }
- cout<<"PreOrder output the tree:"<<endl;
- BSt.PreOrder(BSn);
- cout<<endl<<"Inorder output the tree:"<<endl;
- BSt.InOrder(BSn);
- cout<<endl<<"PostOrder output the tree:"<<endl;
- BSt.PostOrder(BSn);
- char it;
- cin>>it;
- if(BSt.Find(BSn,it)) cout<<"There have the some number in the tree"<<endl;
- else cout<<"No found "<<it<<" in the tree."<<endl;
- return 0;
- }