关于二叉树先序中序后序遍历,用栈实现非递归操作
#include<bits/stdc++.h>
#define Max 50
using namespace std;
typedef struct Node
{
char data;
struct Node *Lchild;
struct Node *Rchild;
}BiTNode,*BiTree;
typedef struct
{
BiTree e[Max];
int top;
}Stack;
void Init(Stack *s)
{
s->top = -1;
}
void push(Stack *s,BiTree x)
{
if(s->top != Max - 1)
{
s->top++;
s->e[s->top] = x;
}
}
void pop(Stack *s,BiTree *x)
{
if(s->top != -1)
{
*x = s->e[s->top];
s->top--;
}
}
void GetTop(Stack *s,BiTree *x)
{
if(s->top != -1)
*x = s->e[s->top];
}
void PreOrder(BiTree root)
{
Stack s;
BiTree p;
p = root;
Init(&s);
while(p != NULL || s.top != -1)
{
while(p != NULL)
{
push(&s,p);
cout<<p->data<<' ';
p = p->Lchild;
}
GetTop(&s,&p);
pop(&s,&p);
p = p->Rchild;
}
}
void InOrder(BiTree root)
{
Stack s;
Init(&s);
BiTree p;
p = root;
while(p != NULL || s.top != -1)
{
if(p != NULL)
{
push(&s,p);
p = p->Lchild;
}
else
{
pop(&s,&p);
cout<<p->data<<' ';
p = p->Rchild;
}
}
}
void PostOrder(BiTree root)
{
BiTree p,q;
Stack s;
q = NULL;
p = root;
Init(&s);
while(p != NULL || s.top != -1)
{
if(p != NULL)
{
push(&s,p);
p = p->Lchild;
}
else
{
GetTop(&s,&p);
if(p->Rchild == NULL || p ->Rchild == q)//无右孩子或者右孩子已遍历过
{
cout<<p->data<<' ';//访问根节点
q = p;//保存到q,为下一次已处理节点前驱
pop(&s,&p);
p = NULL;
}
else
p = p->Rchild;
}
}
}
void CreateBiTree(BiTree &bt)
{
char ch;
ch = getchar();
if(ch == '#')
bt = NULL;
else
{
bt = (BiTree)malloc(sizeof(BiTNode));
bt->data = ch;
CreateBiTree(bt->Lchild);
CreateBiTree(bt->Rchild);
}
}
int main()
{
BiTree a;
CreateBiTree(a);
PreOrder(a);
cout<<endl;
InOrder(a);
cout<<endl;
PostOrder(a);
return 0;
}