#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree CreateBiTree( ){
char ch;
scanf("%c",&ch);
if(ch=='#') return NULL;
else{
BiTree T = (BiTree)malloc(sizeof(BiTNode));
T -> lchild = T -> rchild = NULL;
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
return T;
}
}
//先序遍历非递归算法
void PreOrder(BiTree T){
initStack(S);
BiTree p=T;
while(p||!isEmpty(S)){
if(p){
printf("%c",p->data);
push(S,p);
p=p->lchild;
}
if(!isEmpty(S)){
p=pop(S);
p=p->rchild;
}
}
}
//中序遍历非递归算法
void InOrder(BiTree T){
initStack(S);
BiTree p=T;
while(p||!isEmpty(S)){
if(p){
push(S,p);
p->lchild;
}
else{
p=pop(S);
printf("%c",p->data);
p=p->rchild;
}
}
}
//后序遍历非递归算法
void PostOrder(BiTree T){
initStack(S);
BiTree p=T,r=NULL; //p为工作指针,r为辅助指针
while(p||!isEmpty(S)){
if(p){
push(S,p);
p=p->lchild;
} //从根结点到最左下角的左子树都进栈
else{
GetTop(S,p); //取栈顶结点,注意不是出栈
//1,右子树不为空,2,且右子树未被访问
if(p->rchild&&p->rchild!=r)
p=p->rchild;
else{
p=pop(S);
printf("%c",p->data);
r=p; //指向访问过的右子树的根结点
p=NULL; //使p为空从而继续访问栈顶
}
}
}
}
//层次遍历算法
void LevelOrder(BiTree T){
initQueue(Q);
BiTree p;
EnQueue(Q,T); //根结点入队
while(!isEmpty(Q)){ //队列不空则循环
DeQueue(Q,p); //队头元素出队
printf("%c",p->lchild);
if(p->lchild!=NULL)
EnQueue(Q,p->lchild);
if(p->rchild!=NULL)
EnQueue(Q,p->rchild);
}
}