69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int (* FUN)(char);
typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}*bitree,bitnode;
typedef struct
{
bitree *base;
bitree *top;
int stacksize;
}sqstack;
int initstack(sqstack &s)
{
s.base=(bitree *)malloc(STACK_INIT_SIZE *sizeof(bitree));
if(!s.base)
exit(0);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return 1;
}
int gettop(sqstack s,bitree &e)
{
if(s.top==s.base)
return 0;
e=*(s.top-1);
return 1;
}
int push(sqstack &s,bitree e)
{
if(s.top-s.base==s.stacksize)
{
s.base=(bitree *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree));
if(!s.base)
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return 1;
}
int pop(sqstack &s,bitree &e)
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}
int stackempty(sqstack s)
{
if(s.top-s.base==0)
return 1;
else return 0;
}
int createbitree(bitree &t)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
t=0;
else
{
if(!(t=(bitnode *)malloc(sizeof(bitnode))))
exit(0);
t->data=ch;
createbitree(t->lchild);
createbitree(t->rchild);
}
return 1;
}
int visit(char e)
{
if(e!='0')
{
printf("E is:%c",e);
printf("\n");
return 1;
}
else return 0;
}
int inordertraverse(bitree t, FUN f)
{
sqstack s;
bitree p;
initstack(s);
push(s,t);
while(!stackempty(s))
{
while(gettop(s,p)&&p)
push(s,p->lchild);
pop(s,p);
if(!stackempty(s))
{
pop(s,p);
if(!visit(p->data))
return 0;
push(s,p->rchild);
}
}
return 1;
}
int main(void)
{
bitree t;
char e;
int p;
e=e;
p=p;
createbitree(t);
inordertraverse(t, visit);
}