#define ERROR -2
#define OK 1
#define true 1
#define false 0
#define NULL 0
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define Status int
#define TElemtype char
#define StackElem BiTNode
#define MAX_TREE_SIZE 100
#include <stdio.h>
typedef struct BiTNode{
TElemtype data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
StackElem *base;
StackElem *top;
int stacksize;
}SqStack;
int InitStack(SqStack *S)
{
(*S).base=(StackElem *)malloc(STACK_INT_SIZE*sizeof(StackElem));
if(!(*S).base) return ERROR;
(*S).top=(*S).base;
(*S).stacksize=STACK_INT_SIZE;
return OK;
}
int GetTop(SqStack S,StackElem *e)
{if(S.base==S.top) return ERROR;
*e=*(S.top-1);/*different from book!*/
return OK;
}
int Push(SqStack *S,StackElem e)
{
if((*S).top-(*S).base>=(*S).stacksize){
(*S).base=(StackElem *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(StackElem));
if((*S).base) exit(OVERFLOW);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*((*S).top)=e;
(*S).top++;
return OK;
}
int Pop(SqStack *S,StackElem *e)
{if((*S).top==(*S).base)
return ERROR;
--(*S).top;
*e=*((*S).top);
return OK;
}
int StackEmpty(SqStack S)
{if(S.top==S.base)
return true;
else
return false;
}
Status Visit(TElemtype e){ /*the easist VISIT function*/
printf("%c->",e);
return OK;
}/*Visit*/
BiTNode *q;
Status InOrderTraverse(BiTree T)
{SqStack *S;
S=(SqStack *)malloc(sizeof(SqStack));
q=(BiTNode *)malloc(sizeof(BiTNode));
InitStack(S);
q=T;
while(q||!StackEmpty(*S))
{ if(q){Push(S,*q);
q=q->lchild;}
else{
Pop(S,q);
if(!Visit(q->data)) return ERROR;
q=q->rchild;
}/*else*/
}/*while()*/
return OK;
}/*InOrder VisitTree*/
Status PreOrderTraverse(BiTree T) /* ,Status (*Visit)(TElemType e)) */
{
if(T){
if(Visit(T->data))
if(PreOrderTraverse(T->lchild))
if(PreOrderTraverse(T->rchild)) return OK;
return ERROR;
}/*if(T)*/
else return OK;
}/*PreOder VisteTree*/
Status PostOrderTraverse(BiTree T)
{
if(T){
if(PostOrderTraverse(T->lchild))
if(PostOrderTraverse(T->rchild))
if(Visit(T->data)) return OK;
return ERROR;
}/*if(T)*/
else return OK;
}/*PostOder VisteTree*/
Status CreateBiTree(BiTree *T)
{char *ch;
ch=(char *)malloc(sizeof(char));
scanf("%c",ch);
if(*ch==' ') *T=NULL;
else{
if(!((*T)=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
(*T)->data=*ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}/*else*/
return OK;
}/*CreaTtree*/
main()
{BiTree *myTree;
myTree=(BiTree *)malloc(sizeof(BiTree));
clrscr();
printf("Please input chars:/n");
CreateBiTree(myTree);
printf("InOrderTraverse:/n");
InOrderTraverse(*myTree);
printf("/n");
printf("PreOrderTraverse:/n");
PreOrderTraverse(*myTree);
printf("/n");
printf("PostOrderTraverse:/n");
PostOrderTraverse(*myTree);
printf("/n");
printf("Check any button quit the programe!");
getch();
}