#include<bits/stdc++.h>
#define MaxSize 100
typedef struct node
{
char data;
struct node *lchild,*rchild;
}BTNode;
typedef struct
{
BTNode *data[MaxSize];
int top;
}SqStack;
void Greate(BTNode *&T)
{
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
T=(BTNode*)malloc(sizeof(BTNode));
T->data=ch;
Greate(T->lchild);
Greate(T->rchild);
}
}
//初始化
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
//入栈
bool Push(SqStack *&s, node *e)
{
if(s->top==MaxSize-1)
{
return false;
}
s->top++;
s->data[s->top]=e;
return true;
}
//销毁栈
void Destory(SqStack *&s)
{
free(s);
}
bool StackEmpty(SqStack *s)
{
return(s->top==-1);
}
//出栈
bool Pop(SqStack *&s,node *&e)
{
if(s->top==-1)
{
return false;
}
e=s->data[s->top];
s->top--;
return true;
}
//取栈顶元素
bool GetTop(SqStack *s,node *&e)
{
if(s->top==-1) return false;
e=s->data[s->top];
return true;
}
//先序遍历两种非递归算法
void PreOrder1(BTNode *T)
{
BTNode *p;
SqStack *st;
InitStack(st);
if(T!=NULL)
{
Push(st,T);
while(!StackEmpty(st))
{
Pop(st,p);
printf("%c",p->data);
if(p->rchild!=NULL) Push(st,p->rchild);
if(p->lchild!=NULL) Push(st,p->lchild);
}
printf("\n");
}
Destory(st);
}
void PreOrder2(BTNode *T)
{
BTNode *p;
SqStack *st;
InitStack(st);
p=T;
while(!StackEmpty(st) || p!=NULL)
{
while(p!=NULL)
{
printf("%c",p->data);
Push(st,p);
p=p->lchild;
}
if(!StackEmpty(st))
{
Pop(st,p);
p=p->rchild;
}
}
printf("\n");
Destory(st);
}
//中序遍历两种非递归算法
void InOrder(BTNode *T)
{
BTNode *p;
SqStack *st;
InitStack(st);
p=T;
while(!StackEmpty(st) || p!=NULL)
{
while(p!=NULL)
{
Push(st,p);
p=p->lchild;
}
if(!StackEmpty(st))
{
Pop(st,p);
printf("%c",p->data);
p=p->rchild;
}
}
printf("\n");
Destory(st);
}
//后序遍历非递归算法
void PostOrder(BTNode *T)
{
BTNode *p,*r;
bool flag;
SqStack *st;
InitStack(st);
p=T;
do
{
while(p!=NULL)
{
Push(st,p);
p=p->lchild;
}
r=NULL;
flag=true;
while(!StackEmpty(st) && flag)
{
GetTop(st,p);
if(p->rchild==r)
{
printf("%c",p->data);
Pop(st,p);
r=p;
}
else
{
p=p->rchild;
flag=false;
}
}
}while(!StackEmpty(st));
printf("\n");
Destory(st);
}
int main()
{
BTNode *T;
Greate(T);
PreOrder1(T);
PreOrder2(T);
InOrder(T);
PostOrder(T);
return 0;
}