#include "stdafx.h"
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
#define SMAXSIZE 100
//二叉树的创建
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//存储二叉树的栈
BiTree CreateBiTree()
{
char e;
BiTree T;
cin>>e;
if(e=='#') T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=e;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return T;
}
//前序递归遍历
void PreOrder(BiTree T)
{
if(T!=NULL)
{
cout<<T->data <<" ";
PreOrder(T->lchild );
PreOrder(T->rchild );
}
}
//中序递归遍历
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->lchild );
cout<<T->data <<" ";
InOrder(T->rchild );
}
}
//后序递归遍历
void PostOrder(BiTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild );
PostOrder(T->rchild );
cout<<T->data <<" ";
}
}
//前序非递归遍历
void Pre_Order(BiTree T)
{
BiTree stack[SMAXSIZE],p;
int top;
if(T!=NULL)
{
top=1;
stack[top]=T;
while(top>0)
{
p=stack[top--];
cout<<p->data<<" ";
if(p->rchild!=NULL)
stack[++top]=p->rchild;
if(p->lchild!=NULL)
stack[++top]=p->lchild;
}
}
}
//中序非递归遍历
void In_Order(BiTree T)
{
BiTree stack[SMAXSIZE],p;
p=T;
int top =0;
while(p!=NULL||top>0)
{
if(p!=NULL)
{
stack[++top]=p;
p=p->lchild ;
}
else{
p=stack[top--];
cout<<p->data<<" " ;
p=p->rchild ;
}
}
}
//后序非递归遍历
void Post_Order(BiTree T)
{
typedef struct
{
BiTree ptr;
int tag;
}Snode;
Snode stack[SMAXSIZE] ,s;
int top=0;
BiTree p=T;
while(p!=NULL||top>0)
{
if(p!=NULL)
{
s.ptr=p;
s.tag=1;
stack[++top]=s;
p=p->lchild ;//继续遍历左子树
}
else {
s=stack[top--];//当p=NULL且top>0是,则做出栈操作
p=s.ptr;
if(s.tag==1)
{
//第二次入栈tag标记为2
s.tag=2;
stack[++top]=s;
p=p->rchild ; //继续遍历右子树
}
else {
cout<<p->data ;
p=NULL;
}
}
}
}
void main()
{
BiTree T;
printf("创建二叉树:\n");
printf("**********************************************************\n");
printf("请按顺序输入二叉树的元素: \n");
T=CreateBiTree();
//下面是二叉树的递归遍历
cout<<"下面是遍历二叉树"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"\n下面是先序递归遍历:"<<endl;
PreOrder(T);
cout<<"\n下面是中序递归遍历:"<<endl;
InOrder(T);
cout<<"\n下面是后序递归遍历:"<<endl;
PostOrder(T);
cout<<"递归遍历完毕"<<endl;
cout<<"\n下面是非递归遍历:"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"下面是先序非递归遍历"<<endl;
Pre_Order(T);
cout<<"\n下面是中序非递归遍历"<<endl;
In_Order(T);
cout<<"\n\n全部遍历结束!"<<endl;
}