#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct node {
ElemType data;
struct node *left;
struct node *right;
} BiTree;
typedef struct {
BiTree *pre;
char tag;
} seqstack;
BiTree *CreateBiTree() {
BiTree *t;
ElemType a;
scanf("%c",&a);
if(a=='#') {
return NULL;
} else {
t=(BiTree *)malloc(sizeof(BiTree));
t->data=a;
t->left=CreateBiTree();
t->right=CreateBiTree();
return t;
}
}
//递归
void PreOrder_recursion(BiTree *t) {
if(t==NULL) {
return;
}
printf("%c",t->data);
PreOrder_recursion(t->left);
PreOrder_recursion(t->right);
}
void InOrder_recursion(BiTree *t) {
if(t==NULL) {
return;
}
InOrder_recursion(t->left);
printf("%c",t->data);
InOrder_recursion(t->right);
}
void PostOrder_recursion(BiTree *t) {
if(t==NULL) {
return;
}
PostOrder_recursion(t->left);
PostOrder_recursion(t->right);
printf("%c",t->data);
}
//非递归
void PreOrder_Stack(BiTree *t) {
BiTree *p ,*s[100];
int top=0;
if(t==NULL) {
return;
} else {
p=t;
do {
while(p!=NULL) {
printf("%c",p->data);
s[top++]=p;
p=p->left;
}
if(top>0) {
p=s[--top];
p=p->right;
}
} while(top>0||p!=NULL);
}
}
void InOrder_Stack(BiTree *t) {
BiTree *p ,*s[100];
int top=0;
if(t==NULL) {
return;
} else {
p=t;
do {
while(p!=NULL) {
s[top++]=p;
p=p->left;
}
if(top>0) {
p=s[--top];
printf("%c",p->data);
p=p->right;
}
} while(top>0||p!=NULL);
}
}
void PostOrder_Stack(BiTree *t) {
BiTree *p;
seqstack s[100],q;
int top=0;
if(t==NULL) {
return;
} else {
p=t;
do {
while(p!=NULL) {
q.pre=p;
q.tag='L';
s[top++]=q;
p=p->left;
}
if(top>0) {
q=s[--top];
do {
if(q.tag=='L') {
p=q.pre->right;
q.tag='R';
s[top++]=q;
break;
}
printf("%c",q.pre->data);
q=s[--top];
} while(1&&top>=0);
}
} while(top>0||p!=NULL);
}
}
void LevelOrder(BiTree *t){
BiTree *p,*qu[100];
int rear=0,front=0;
if(t==NULL){
return;
}else{
qu[rear]=t;
rear=(rear+1)%100;
while(rear!=front){
p=qu[front];
front=(front+1)%100;
printf("%c",p->data);
if(p->left!=NULL){
qu[rear]=p->left;
rear=(rear+1)%100;
}
if(p->right!=NULL){
qu[rear]=p->right;
rear=(rear+1)%100;
}
}
}
}
int main() {
BiTree *mytree;
mytree=CreateBiTree();
//递归
printf("递归:\n");
printf("DLR:");
PreOrder_recursion(mytree);//DLR
printf("\n");
printf("LDR:");
InOrder_recursion(mytree);//LDR
printf("\n");
printf("LRD:");
PostOrder_recursion(mytree);//LRD
printf("\n");
//非递归
printf("栈:\n");
printf("DLR:");
PreOrder_Stack(mytree);//DLR
printf("\n");
printf("LDR:");
InOrder_Stack(mytree);//LDR
printf("\n");
printf("LRD:");
PostOrder_Stack(mytree);//LRD
printf("\n层序:");
LevelOrder(mytree);
}
若有问题欢迎提出!