#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INSEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREAMENT 10
typedef char ElemType;
typedef int Status;
typedef struct BiTNode
{
ElemType date;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
typedef struct
{
BiTree* base;
BiTree* top;
int stacksize;
}bitStack;
Status InitStack_bit(bitStack &S)
{
S.base=(BiTree*)malloc(STACK_INIT_SIZE*(sizeof(BiTree)));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE; //别忘了这一步
return OK;
}
Status Push(bitStack &S,BiTree e) //push进来的是指针地址
{
if(S.top-S.base>=S.stacksize) //如果栈满了,需再申请空间
{
S.base=(BiTree*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(BiTree));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;
}
*S.top++=e;
return OK;
}
BiTree Pop(bitStack &S)
{
if(S.base==S.top) return ERROR;
return *--S.top;
}
Status GetTop(bitStack &S,BiTree &e)
{
if(S.base==S.top) return ERROR;
e=*--S.top;
S.top++;
return OK;
}
int StackEmpty(bitStack S)
{
if(S.top==S.base) return TRUE;
return FALSE;
}
Status CreateBiTree(BiTree &T)
{
ElemType ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T) exit(OVERFLOW);
T->date=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
//先序遍历
void PreOrderTraverse(BiTree T)
{
BiTree P=T; //为避免T指针的指向发生变化 则创建指针P指向T指的结点
bitStack S; //声明栈
InitStack_bit(S); //初始化栈
while(P||!StackEmpty(S)) //当树不空或者栈不空 则表明还有结点未遍历
{
while(P) //当树不空时
{
Push(S,P);
printf("%c",P->date);
P=P->lchild;
}
if(!StackEmpty(S)) //如果栈不空时
{
P=Pop(S); //栈弹出栈顶元素(即指向结点的地址)
P=P->rchild; //访问其右孩子
}
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
BiTree P=T;
bitStack S;
InitStack_bit(S);
while(P||!StackEmpty(S))
{
while(P)
{
Push(S,P);
P=P->lchild;
}
if(!StackEmpty(S))
{
P=Pop(S);
printf("%c",P->date);
P=P->rchild;
}
}
}
int main()
{
BiTree T;
printf("开始建树,请输入二叉树各个节点的值(按先序次序输入):\n");
CreateBiTree(T);
printf("\n 以下是该树的先序遍历序列:\n");
PreOrderTraverse(T);
printf("\n 以下是该树的中序遍历序列:\n");
InOrderTraverse(T);
printf("\n 以下是该树的后序遍历序列:\n");
PostOrderTraverse(T);
}