非递归遍历
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct Bitnode
{
char data;
Bitnode *lchild,*rchild;
}Bitnode,*Bitree;
typedef struct
{
Bitree *base;
Bitree *top;
int stacksize;
}sqstack;
void createTree(Bitree &t)
{
char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else{
t=(Bitree)malloc(sizeof(Bitnode));
if(t==NULL)
exit(-2);
t->data=ch;
createTree(t->lchild);
createTree(t->rchild);
}
}
void InitStack(sqstack &s)
{ s.base=(Bitree *)malloc(maxsize*sizeof(Bitree));
if(s.base==NULL)
exit(-2);
s.top=s.base;
s.stacksize=maxsize;
}
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+maxsize)*sizeof(Bitree));
if(s.base==NULL)
exit(-2);
s.top=s.base+s.stacksize;
s.stacksize+=maxsize;
}
*s.top++=e;
return 1;
}
int pop(sqstack &s,Bitree &e)
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}
void preorder(Bitree t)
{ sqstack s;
Bitree p;
InitStack(s);
if(t)
{
push(s,t);
while(s.base!=s.top)
{
pop(s,p);
printf("%c",p->data);
if(p->rchild)
push(s,p->rchild);
if(p->lchild)
push(s,p->lchild);
}
}
}
void inorder(Bitree t)
{
sqstack s;
Bitree p;
InitStack(s);
push(s,t);
while(s.base!=s.top)
{
while(GetTop(s,p)&&p)
{
push(s,p->lchild);
}
pop(s,p);
if(s.top!=s.base){
pop(s,p);
printf("%c",p->data);
push(s,p->rchild);
}
}
}
int main()
{
Bitree t;
createTree(t);
inorder(t);
}
abd ef cg h k
dbfeagchk