#include<stdio.h>
#include<malloc.h>
typedef struct binode{
char data;
struct binode *lchild;
struct binode *rchild;
}BiNode,*BiTree;
/****************************
*输入创建二叉树: abd##ef###c##
*其实输入按照先序顺序,#表示叶子节点
*****************************/
void create(BiTree t){
char ch=(char)getchar();
if(ch=='#'){
t->data='#';
t->lchild=NULL;
t->rchild=NULL;
}
else{
t->data=ch;
t->lchild=(BiTree)malloc(sizeof(BiNode));
create(t->lchild);
t->rchild=(BiTree)malloc(sizeof(BiNode));
create(t->rchild);
}
}
//先序遍历
void preTraverse(BiTree t){
BiTree p=t;
BiTree stack[20]; //使用栈来替代递归方法
int top=0;
while(top>=0){
while(p->data!='#'){
printf("%c ",p->data);
stack[top++]=p;
p=p->lchild;
}
if(top>0)
p=stack[--top]->rchild;
else
top=-1;
}
}
//中序遍历,和先序差不多
void midTraverse(BiTree t){
BiTree p=t;
BiTree stack[20];
int top=0;
while(top>=0){
while(p->data!='#'){
stack[top++]=p;
p=p->lchild;
}
if(top>0){
p=stack[--top];
printf("%c ",p->data);
p=p->rchild;
}else
top=-1;
}
}
//后序遍历,稍微复杂一点
void afeTraverse(BiTree t){
BiTree p=t,q=t;
BiTree stack[20];
int top=0;
while(top>=0){
while(p->data!='#'){
stack[top++]=p;
p=p->lchild;
}
if(q->rchild==p){
printf("%c ",q->data);
q->data='#'; //遍历完的节点直接做叶子标记
--top;
}
if(top>0){
p=stack[top-1];
q=p;
p=p->rchild;
}
}
}
//测试
int main(){
BiTree root=(BiTree)malloc(sizeof(BiNode));
create(root);
afeTraverse(root);
printf("\n");
return 1;
}