数据结构作业之二叉树的任务书和路径遍历法遍历

数据结构作业,二叉树的任务书和路径遍历法遍历


#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值