建立完成之后 需要前中后序遍历 以及层序遍历
结果中递归中序遍历跟后序遍历是错误的 其他都正确 求教
#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
擦= =我傻逼了。。。没注意到这个问题 谢谢指正
#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
擦= =我傻逼了。。。没注意到这个问题 谢谢指正