1.结点
template <typename T>
class BiNode{
public:
T data;
BiNode<T> *lchild,*rchild;
};
2.框架
template <typename T>
class BiTree
{
public:
BiTree(){root=new BiNode<T>;root=Creat();}
BiTree(T pre[],T in[],int s){root=new BiNode<T>;root=Creat2(pre,in,s);}
void PreOrder(){PreOrder(root);}
void InOrder(){InOrder(root);}
void PostOrder(){PostOrder(root);}
private:
BiNode<T> *root;
BiNode<T> *Creat();
BiNode<T> *Creat2(T pre[],T in[],int s);
void PreOrder(BiNode<T> *bt);
void InOrder(BiNode<T> *bt);
void PostOrder(BiNode<T> *bt);
};
3.前序扩展构造
template <typename T>
BiNode<T>* BiTree<T>::Creat(){
BiNode<T> *bt;
char ch;
cin>>ch;
if(ch=='#') bt=NULL ;
else{
bt=new BiNode<T>;
bt->data=ch;
bt->lchild=Creat();
bt->rchild=Creat();
}
return bt;
}
4.前序+中序构造
template <typename T>
BiNode<T>* BiTree<T>::Creat2(T pre[],T in[],int s){
if(s==0) return NULL;
char v=pre[0];
int r=-1;
for(int i=0;i<s;i++)
if(in[i]==v){
r=i;
break;
}
BiNode<T> *f=new BiNode<T>;
f->data=v;
f->lchild=Creat2(pre+1,in,r);
f->rchild=Creat2(pre+1+r,in+1+r,s-1-r);
return f;
}
5.前中后序遍历
template <typename T>
void BiTree<T>::PreOrder(BiNode<T> *bt)
{
if(bt==nullptr) return;
else{
cout<<bt->data<<endl;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
template <typename T>
void BiTree<T>::InOrder(BiNode<T> *bt)
{
if(bt==nullptr) return;
else{
InOrder(bt->lchild);
cout<<bt->data<<endl;
InOrder(bt->rchild);
}
}
template <typename T>
void BiTree<T>::PostOrder(BiNode<T> *bt)
{
if(bt==nullptr) return;
else{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout<<bt->data<<endl;
}
}