📄 page177.cpp
字号:
#include <bintree.h>
#include <stack.h>
#include <queue.h>
#include <process.h>
template <class Type> class TreeIterator{
public:
TreeIterator(const BinaryTree<Type> & BT):T(BT),current(NULL){}
virtual ~TreeIterator(){}
virtual void First()=0;
virtual void operator ++ ()=0;
int operator + () const {return current!=NULL;}
const Type operator()()const;
protected:
const BinaryTree<Type> T;
const BinTreeNode<Type> * current;
private:
TreeIterator(const TreeIterator<Type> & ){}
const TreeIterator<Type> & operator = (const TreeIterator<Type> &);
};
template<class Type> const Type TreeIterator<Type>::operator()()const{
if(current==NULL){
cerr<<"Illegal access"<<endl;
exit(1);
}
return current->GetData();
}
template <class Type> struct stkNode{
const BinTreeNode<Type> * Node;
int PopTim;
stkNode(const BinTreeNode<Type> * N=NULL):Node(N),PopTim(0){}
};
template <class Type> class PostOrder:public TreeIterator<Type>{
public:
PostOrder(const BinaryTree<Type> & BT);
~PostOrder(){}
void First();
void operator ++();
protected:
Stack <stkNode<Type> > st;
};
template <class Type> PostOrder<Type>::PostOrder(const BinaryTree<Type> & BT):
TreeIterator<Type>(BT){
st.Push(stkNode<Type>(BT.GetRoot()));
}
template <class Type> void PostOrder<Type>::First(){
st.MakeEmpty();
if(T.GetRoot()!=NULL) st.Push(stkNode<Type> (T.GetRoot()));
operator ++();
}
template <class Type> void PostOrder<Type>::operator ++(){
if(st.IsEmpty()){
if(current==NULL){
cerr<<"Advanced past end"<<endl;
exit(1);
}
current=NULL;
return;
}
stkNode<Type> Cnode;
for(;;){
Cnode=st.Pop();
if(++Cnode.PopTim==3){
current=Cnode.Node;
return;
}
st.Push(Cnode);
if(Cnode.PopTim==1){
if(Cnode.Node->GetLeft()!=NULL)
st.Push(stkNode<Type> (Cnode.Node->GetLeft()));
}
else{
if(Cnode.Node->GetRight()!=NULL)
st.Push(stkNode<Type> (Cnode.Node->GetRight()));
}
}
}
template<class Type> class InOrder:public PostOrder<Type>{
public:
InOrder(BinaryTree<Type> & BT):PostOrder<Type> (BT){}
void First();
void operator ++();
};
template<class Type> void InOrder<Type>::First(){
st.MakeEmpty();
if(T.GetRoot()!=NULL) st.Push(stkNode<Type>(T.GetRoot()));
operator ++();
}
template <class Type> void InOrder<Type>::operator ++(){
if(st.IsEmpty()){
if(current==NULL){
cerr<<"Advanced past end"<<endl;
exit(1);
}
current=NULL;
return;
}
stkNode<Type> Cnode;
for(;;){
Cnode=st.Pop();
if(++Cnode.PopTim==2){
current=Cnode.Node;
if(Cnode.Node->GetRight()!=NULL)
st.Push(stkNode<Type>(Cnode.Node->GetRight()));
return;
}
st.Push(Cnode);
if(Cnode.Node->GetLeft()!=NULL)
st.Push(stkNode<Type>(Cnode.Node->GetLeft()));
}
}
template <class Type> class PreOrder:public TreeIterator<Type>{
public:
PreOrder(const BinaryTree<Type> & BT);
~PreOrder(){}
void First();
void operator ++();
protected:
Stack<const BinTreeNode<Type> * > st;
};
template <class Type> PreOrder<Type>::PreOrder(const BinaryTree<Type> & BT):
TreeIterator<Type>(BT){
st.Push(BT.GetRoot());
}
template <class Type> void PreOrder<Type>::First(){
st.MakeEmpty();
if(T.GetRoot())st.Push(T.GetRoot());
operator ++();
}
template <class Type> void PreOrder<Type>::operator ++(){
if(st.IsEmpty()){
if(current==NULL){
cerr<<"Advanced past end"<<endl;
exit(1);
}
current=NULL;
return;
}
current=st.Pop();
if(current->GetRight()!=NULL) st.Push(current->GetRight());
if(current->GetLeft()!=NULL) st.Push(current->GetLeft());
return;
}
template <class Type> class LevelOrder:public TreeIterator<Type>{
public:
LevelOrder(const BinaryTree<Type> & BT);
~LevelOrder(){}
void First();
void operator ++();
protected:
Queue<const BinTreeNode<Type> * > qu;
};
template <class Type> LevelOrder<Type>::LevelOrder(const BinaryTree<Type> & BT):
TreeIterator<Type>(BT){qu.EnQueue(BT.GetRoot());}
template <class Type> void LevelOrder<Type>::First(){
qu.MakeEmpty();
if(T.GetRoot()) qu.EnQueue(T.GetRoot());
operator ++();
}
template <class Type> void LevelOrder<Type>::operator ++(){
if(qu.IsEmpty()){
if(current==NULL){
cerr<<"Advanced past end"<<endl;
exit(1);
}
current=NULL;
return;
}
current=qu.DeQueue();
if(current->GetLeft()!=NULL) qu.EnQueue(current->GetLeft());
if(current->GetRight()!=NULL) qu.EnQueue(current->GetRight());
}
void main(){
BinaryTree<int> bt;
cin>>bt;
PostOrder<int> btpostorder(bt);
btpostorder.First();
cout<<"now,postorder:\n";
while(+btpostorder){
cout<<btpostorder()<<' ';
++btpostorder;
}
cout<<endl;
InOrder<int> btinorder(bt);
btinorder.First();
cout<<"now,inorder:\n";
while(+btinorder){
cout<<btinorder()<<' ';
++btinorder;
}
cout<<endl;
PreOrder<int> btpreorder(bt);
btpreorder.First();
cout<<"now,preorder:\n";
while(+btpreorder){
cout<<btpreorder()<<' ';
++btpreorder;
}
cout<<endl;
LevelOrder<int> btlevelorder(bt);
btlevelorder.First();
cout<<"now,levelorder:\n";
while(+btlevelorder){
cout<<btlevelorder()<<' ';
++btlevelorder;
}
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -