关于广义表创建二叉树遍历的问题

时间:2021-05-19 19:30:46
程序运行除了一些问题,求大神指正
建立完成之后 需要前中后序遍历 以及层序遍历
结果中递归中序遍历跟后序遍历是错误的 其他都正确 求教
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
    char data;
    struct node *lchild,*rchild;
}bitree;
typedef struct
{
bitree *data[15];
int top;
}gen;
typedef struct
{
    bitree *data[15];
    int front,rear;
}Sequeue;
bitree *build(bitree *a)
{
gen *d;
bitree *e;
char c;
int flag=0;
d=(gen *)malloc(sizeof(gen));
d->top=-1;
c=getchar();
while(c!='@')
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
{
e=(bitree *)malloc(sizeof(bitree));
e->data=c;
e->lchild=e->rchild=NULL;
if(flag==0)
{d->top++;d->data[d->top]=e;}
if(flag==1)
d->data[d->top]->lchild=e;
if(flag==2)
d->data[d->top]->rchild=e;
c=getchar();
}
if(c=='(')
{
flag=1;
d->data[++d->top]=e;
    c=getchar();
}
if(c==')')
{d->top--;c=getchar();}
if(c==',')
{flag=2;c=getchar();}
}
a=d->data[0];
return a;
}
void PreOrderTraverse(bitree *T)
{
if(T)
{
printf("\t%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(bitree *T)
{
if(T)
{
PreOrderTraverse(T->lchild);
printf("\t%c",T->data);
PreOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(bitree *T)
{
if(T)
{
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf("\t%c",T->data);
}
}
void InOrderT(bitree *T)
{ bitree *p=T;gen *s;
   s=(gen *)malloc(sizeof(gen));
   s->top=-1;//建栈
   while(p||s->top!=-1) //还有未访问的
   {
   if(p)//一直向左走到底,路过的所有的根入栈
   {
      s->data[++s->top]=p;p=p->lchild; //遍历左子树 
   }
      else   //p为NULL,说明走到了底
      { 
      p=s->data[s->top--];printf("\t%c",p->data);
          //弹出一个还没访问的结点,访问之
          p=p->rchild; //遍历右子树  
  }
   }
}
int LevelOrderTraverse(bitree *T)

   Sequeue *q;bitree *p;
   q=(Sequeue *)malloc(sizeof(Sequeue));
   q->front=q->rear=0;
   q->rear++;q->data[q->rear]=T;     //树根入队
   while(q->front!=q->rear)        //只要队列非空
   {
      q->front++;
  p=q->data[q->front];              //出队一个结点
  if(p)printf("\t%c",p->data);
  else return 0;     //访问之
       //左孩子入队
      if(p->lchild){
  q->rear++;q->data[q->rear]=p->lchild;}
        //右孩子入队
      if(p->rchild){
  q->rear++;q->data[q->rear]=p->rchild;}
  }
    return 1;
}
int main()
{
bitree b;
bitree *a;
a=build(&b);
printf("先序遍历:");
PreOrderTraverse(a);
printf("\n"); 
printf("中序遍历:");
InOrderTraverse(a);
printf("\n"); 
printf("后序遍历:");
PostOrderTraverse(a);
printf("\n"); 
printf("非递归中序遍历:");
InOrderT(a);
printf("\n"); 
printf("层序遍历:"); 
LevelOrderTraverse(a);
printf("\n"); 
system("pause");
return 0;
}

3 个解决方案

#1


关于广义表创建二叉树遍历的问题
这是结果

#2


void InOrderTraverse(bitree *T)
{
    if(T)
    {
        InOrderTraverse(T->lchild);
        printf("\t%c",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(bitree *T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("\t%c",T->data);
    }
}

#3


引用 2 楼 haolly 的回复:
void InOrderTraverse(bitree *T)
{
    if(T)
    {
        InOrderTraverse(T->lchild);
        printf("\t%c",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(bitree *T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("\t%c",T->data);
    }
}

擦= =我傻逼了。。。没注意到这个问题 谢谢指正

#1


关于广义表创建二叉树遍历的问题
这是结果

#2


void InOrderTraverse(bitree *T)
{
    if(T)
    {
        InOrderTraverse(T->lchild);
        printf("\t%c",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(bitree *T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("\t%c",T->data);
    }
}

#3


引用 2 楼 haolly 的回复:
void InOrderTraverse(bitree *T)
{
    if(T)
    {
        InOrderTraverse(T->lchild);
        printf("\t%c",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(bitree *T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("\t%c",T->data);
    }
}

擦= =我傻逼了。。。没注意到这个问题 谢谢指正