数据结构作业,二叉树的任务书和路径遍历法遍历
#include <stdio.h>
#include <stdlib.h>
typedef struct binode
{
char data;
struct binode *lchild,*rchild;
}Binode,*Bitree;
typedef struct
{
Bitree data;
int task;
}Task;
typedef struct
{
Task *data;
int top;
}Stack;
int initstack(Stack *L)
{
L->data=(Task *)malloc(sizeof(Task)*100);
L->top=0;
return 1;
}
int enstack(Stack *L,Task e)
{
L->data[L->top]=e;
L->top++;
return 1;
}
Task destack(Stack *L)
{
Task T;
L->top--;
T=L->data[L->top];
return T;
}
void createbitree(Bitree &L)
{
char ch;
ch=getchar();
if(ch=='#')
L=NULL;
else
{
L=(Bitree)malloc(sizeof(Binode));
L->lchild=L->rchild=NULL;
L->data=ch;
createbitree(L->lchild);
createbitree(L->rchild);
}
}
/*1.先序遍历*/
void dispbitree1_1(Bitree L)
{
Stack S;
initstack(&S);
Task T,t;
int task;
T.data=L;T.task=0;
enstack(&S,T);
while(S.top>0)
{
t=destack(&S);
if(t.task==0)
{
printf("%c ",t.data->data);
if(t.data->rchild)
{
T.data=t.data->rchild;
T.task=0;
enstack(&S,T);
}
T.data=t.data;
T.task=1;
enstack(&S,T);
if(t.data->lchild)
{
T.data=t.data->lchild;
T.task=0;
enstack(&S,T);
}
}
}
}
/*1.中序遍历*/
void dispbitree1_2(Bitree L)
{
Stack S;
initstack(&S);
Task T,t;
int task;
T.data=L;T.task=1;
enstack(&S,T);
while(S.top>0)
{
t=destack(&S);
if(t.task==1)
{
if(t.data->rchild)
{
T.data=t.data->rchild;
T.task=1;
enstack(&S,T);
}
T.data=t.data;
T.task=0;
enstack(&S,T);
if(t.data->lchild)
{
T.data=t.data->lchild;
T.task=1;
enstack(&S,T);
}
}
else if(t.task==0)
{
printf("%c ",t.data->data);
}
}
}
/*1.后序遍历*/
void dispbitree1_3(Bitree L)
{
Stack S;
initstack(&S);
Task T,t;
int task;
T.data=L;T.task=1;
enstack(&S,T);
while(S.top>0)
{
t=destack(&S);
if(t.task==1)
{
T.data=t.data;
T.task=0;
enstack(&S,T);
if(t.data->rchild)
{
T.data=t.data->rchild;
T.task=1;
enstack(&S,T);
}
if(t.data->lchild)
{
T.data=t.data->lchild;
T.task=1;
enstack(&S,T);
}
}
else if(t.task==0)
printf("%c ",t.data->data);
}
}
typedef struct
{
Bitree *data;
int top;
}stack;
int Initstack(stack *L)
{
L->data=(Bitree *)malloc(sizeof(Bitree)*100);
L->top=0;
return 1;
}
int pushstack(stack *S,Bitree L)
{
S->data[S->top]=L;
S->top++;
return 1;
}
Bitree popstack(stack *S)
{
Bitree T;
S->top--;
T=S->data[S->top];
return T;
}
/*2.先序遍历*/
void disp2_1(Bitree L)
{
stack S;Bitree P;
Initstack(&S);
pushstack(&S,L);
while(S.top>0)
{
P=popstack(&S);
while(P)
{
printf("%c ",P->data);
if(P->rchild)
pushstack(&S,P->rchild);
P=P->lchild;
}
}
}
/*2.中序遍历*/
void disp2_2(Bitree L)
{
stack S;
Initstack(&S);
pushstack(&S,L);
while(S.top>0)
{
Bitree P;
while(S.data[S.top-1])
{
P=S.data[S.top-1];
pushstack(&S,P->lchild);
}
P=popstack(&S);
if(S.top>0)
{
P=popstack(&S);
printf("%c ",P->data);
pushstack(&S,P->rchild);
}
}
}
/*后序遍历*/
void disp2_3(Bitree L)
{
stack S;Bitree P;int t=0;int l=0;
Initstack(&S);
pushstack(&S,L);
while(S.top>0)
{
while(S.data[S.top-1])
{
if(S.data[S.top-1]==L)
t++;
if(t==1)
{
P=S.data[S.top-1];
pushstack(&S,P->lchild);
}
else
{
pushstack(&S,L->rchild);
t--;
}
}
popstack(&S);
P=S.data[S.top-1];
if(P->rchild)
pushstack(&S,P->rchild);
else
{
while(S.data[S.top-1]->rchild==NULL)
{
P=popstack(&S);
printf("%c ",P->data);
}
if(S.data[S.top-1]==L)
{
l++;
if(l==1&&P!=L->rchild)
pushstack(&S,L->rchild);
else
{
printf("%c ",L->data);
popstack(&S);
}
}
else
{
if(S.data[S.top-1]!=L&&S.data[S.top-1]->rchild!=P)
pushstack(&S,S.data[S.top-1]->rchild);
else
{
P=popstack(&S);
printf("%c ",P->data);
}
}
}
}
}
int main()
{
Bitree L;
createbitree(L);
printf("\n");
printf("任务书遍历:\n");
dispbitree1_1(L);
printf("\n");
dispbitree1_2(L);
printf("\n");
dispbitree1_3(L);
printf("\n");
printf("-----------\n");
printf("路径分析法:\n");
disp2_1(L);printf("\n");
disp2_2(L);printf("\n");
disp2_3(L);printf("\n");
return 0;
}