#include <stack>
using namespace std;
//定義樹的節點類型
typedef struct Node
{
int data;
struct Node * lchild;
struct Node * rchild;
} tree;
//定義棧存儲節點類型
typedef struct SNode
{
tree * node;
bool isFirst;
}SNode;
//創建樹
void CreateTree(tree * &node)
{
int data;
cin>>data;
if(data==-1)
{
node=NULL;
}
else
{
node=new tree;
node->data=data;
node->lchild=NULL;
node->rchild=NULL;
CreateTree(node->lchild);
CreateTree(node->rchild);
}
}
//遞歸實現樹的前序遍歷
void PreViewTree(tree *node)
{
if(node!=NULL)
{
cout<<node->data<<"\t";
PreViewTree(node->lchild);
PreViewTree(node->rchild);
}
}
//遞歸實現樹的中序遍歷
void MidViewTree(tree *node)
{
if(node!=NULL)
{
MidViewTree(node->lchild);
cout<<node->data<<"\t";
MidViewTree(node->rchild);
}
}
//遞歸實現數的後序遍歷
void LasViewTree(tree *node)
{
if(node!=NULL)
{
LasViewTree(node->lchild);
LasViewTree(node->rchild);
cout<<node->data<<"\t";
}
}
//實現非遞歸樹的前序遍歷
void PreViewStackTree(tree* node)
{
stack<tree*> s1;//push pop top empty
while(node!=NULL || !s1.empty())
{
while(node!=NULL)
{
cout<<node->data<<"\t";
s1.push(node);
node=node->lchild;
}
if(!s1.empty())
{
node=s1.top();
s1.pop();
node=node->rchild;
}
}
}
//實現樹非遞歸的中序遍歷
void MideViewStackTree(tree * node)
{
stack<tree*> s1;//push pop top empty
while(node!=NULL ||!s1.empty())
{
while(node!=NULL)
{
s1.push(node);
node=node->lchild;
}
if(!s1.empty())
{
node=s1.top();
s1.pop();
cout<<node->data<<"\t";
node=node->rchild;
}
}
}
//實現樹的非遞歸後續遍歷
void LastViewStackTree(tree* node)
{
stack<SNode*> s1;
SNode *stnode;
while(node!=NULL || !s1.empty())
{
while(node!=NULL)
{
stnode=new SNode;
stnode->node=node;
stnode->isFirst=true;
s1.push(stnode);
node=node->lchild;
}
if(!s1.empty())
{
stnode=s1.top();
s1.pop();
if(stnode->isFirst)
{
stnode->isFirst=false;
s1.push(stnode);
node=stnode->node->rchild;
}
else
{
cout<<stnode->node->data<<"\t";
node=NULL;
}
}
}
}
int main(int argc, char *argv[])
{
tree *node;
CreateTree(node);
PreViewTree(node);
cout<<endl;
MidViewTree(node);
cout<<endl;
LasViewTree(node);
cout<<endl;
PreViewStackTree(node);
cout<<endl;
LastViewStackTree(node);
cout<<endl;
return 0;
}