#include<stdio.h>
#include<iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;
typedef int Status;
typedef char TElemType;
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
typedef struct StackNode
{ BiNode *Sdata;
int flag;
struct StackNode *next;
}StackNode,*LinkStack;
Status CreateBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch== '#' ) T = NULL;
else {
T=new BiNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
// CreateBiTree
void InitStack(LinkStack &S)
{
S=NULL;
}
Status Push(LinkStack &S , BiTree q)
{
LinkStack p;
p=new StackNode;
if (!p) exit(OVERFLOW);
p->Sdata=q;
p->flag=0;
p->next=S;
S=p;
return OK;
}
Status Pop (LinkStack &S,BiTree &q)
{
LinkStack p;
if (S==NULL) return ERROR;
q = S-> Sdata;
p = S;
S = S-> next;
delete p;
return OK;
}
LinkStack GetTop(LinkStack S)
{
if(S==NULL) return NULL;
else return S;
}
Status PreOrderTraverse( BiTree T)
{
BiTree p;
LinkStack S;
InitStack(S);
p=T;
while (p||(S!=NULL) )
{
if(p)
{
cout<<p->data;
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
p=p->rchild;
}
}
return OK;
}
Status InOrderTraverse(BiTree T)
{
BiTree p;
LinkStack S;
InitStack(S);
p=T;
while(p||(S!=NULL)){
if(p)
{
Push(S,p);
p = p->lchild;
}
else
{
Pop(S,p);
cout<<p->data;
p=p->rchild;
}
}
return OK;
}
Status PostOrderTraverse( BiTree T)
{
LinkStack S;
InitStack(S);
StackNode *q;
BiTree p;
p=T;
while (p||(S!=NULL))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
if(!S)
return 0;
q=GetTop(S);
if(q->Sdata->rchild==NULL||q->flag==1)
{
Pop(S,p);
cout<<p->data;
p=NULL;
}
else
{
q->flag=1;
p=q->Sdata->rchild;
}
}
}
return OK;
}
Status PreOrder(BiTree T){
if(T==NULL)
return OK;
else{
cout<<T->data;
PreOrder (T->lchild);
PreOrder (T->rchild);
}
}
Status InOrder(BiTree T){
if(T==NULL)
return OK;
else{
InOrder(T->lchild);
cout<<T->data;
InOrder(T->rchild);
}
}
Status PostOrder(BiTree T){
if(T==NULL)
return OK;
else{
PostOrder(T->lchild);
PostOrder(T->rchild);
cout<<T->data;
}
}
int main()
{
BiTree T;
int a;
cout<<"Create a BiTree(AB##c##):";
CreateBiTree(T);
for(;;)
{
printf("\ninput a number to choose zhe Non-recursive[1] or recursive[2]\n");
printf("\tinput a [0] stop;\n");
scanf("%d",&a);
if(a==1)
{
cout<<"Non-recursive traversal:";
cout<<"\npreorder:";
PreOrderTraverse(T);
cout<<"\ninorder:";
InOrderTraverse(T);
cout<<"\npostorder:";
PostOrderTraverse(T);
}
else if(a==2)
{
cout<<"Recursive traversal:";
cout<<"\npreorder:";
PreOrder(T);
cout<<"\ninorder:";
InOrder(T);
cout<<"\npostorder:";
PostOrder(T);
}
else break;
}
}
Data Structure——二叉树的遍历
最新推荐文章于 2021-12-03 18:34:10 发布