#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define INFEASIBLE -1
#define MAX_TREE_SIZE 100
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char Status;
typedef char TElemType;
typedef TElemType SqBiTree[MAX_TREE_SIZE];
SqBiTree bt;
//typedef char SElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode * lchild, * rchild;
}BiTNode, * BiTree;
typedef BiTree SElemType;
typedef struct {
SElemType * base;
SElemType * top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S){
S.base=(SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base)exit( OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//初始化
Status StackEmpty(SqStack S)
{
if(S.top==S.base)return TRUE;
return FALSE;
}
Status Push(SqStack &S,SElemType &e){
if(S.top-S.base>=S.stacksize){
S.base=(SElemType * )realloc(S.base,(S.stacksize+STACKINCREMENT) * sizeof(SElemType));
if(!S.base) exit( OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
* S.top++ = e;
return OK;
}//push
Status Pop(SqStack &S,SElemType &e){
if(S.top==S.base)return ERROR;
e= * --S.top;
return OK;
}//Pop
Status CreateBiTree( BiTree &T){
BiTNode * lchild;
BiTNode * rchild;
char ch;
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);
}
return OK;
}//CreateTree
Status InOrderTraverse(BiTree &T, Status(* Visit)(TElemType e)){
SqStack S;
InitStack(S);
BiTNode * p; p=T;
while(p||!StackEmpty(S)){
if(p){Push(S,p); p = p->lchild;}
else{
Pop(S,p); if(!Visit(p->data)) return ERROR;
p=p->rchild;
}//else
}//while
return OK;
}//InOrderTraverse
//Status (*Visit)(TElemType e){
Status PrintElement(TElemType e){
printf("%c",e);
return OK;
}
void main()
{
SqStack S;
BiTree T;
InitStack (S);
CreateBiTree(T);
BiTNode *p;
InOrderTraverse(T,PrintElement);
printf("%c",T);
}
先序非递归建立二叉树 用链表
#include