#include<stdio.h>
#include<malloc.h>
#define SIZE 100
typedef struct node {
char ch;
struct node *lchild;
struct node *rchild;
}BiTNode, *BiTree;
/*二叉树的先序创建*/
void CreatTree(BiTree &T) {
char c;
scanf("%c", &c);
if(c == '0') {
T = NULL;
return;
}
else {
T = (BiTree)malloc(sizeof(BiTNode));
if(!T) {
printf("error");
return;
}
T->ch = c;
CreatTree(T->lchild);
CreatTree(T->rchild);
}
}
/*二叉树的递归先序遍历*/
void PreOrder1(BiTree T) {
if(T != NULL) {
putchar(T->ch);
PreOrder1(T->lchild);
PreOrder1(T->rchild);
}
}
/*二叉树的非递归先序遍历*/
void PreOrder2(BiTree T) {
BiTree stack[SIZE];
BiTree p;
int top = 0;
stack[top] = T;
while(top>=0) {
p = stack[top];
top --;
putchar(p->ch);
if(p->rchild != NULL) {
top ++;
stack[top] = p->rchild;
}
if(p->lchild != NULL) {
top ++;
stack[top] = p->lchild;
}
}
}
/*二叉树的递归中序遍历*/
void InOrder1(BiTree T) {
if(T != NULL) {
InOrder1(T->lchild);
putchar(T->ch);
InOrder1(T->rchild);
}
}
/*二叉树的非递归中序遍历*/
void InOrder2(BiTree T) {
BiTree stack[SIZE];
BiTree p = T;
int top = 0;
stack[top] = T;
while(top >= 0) {
p = stack[top];
if(p == NULL) top --;
while(p != NULL) {
p = p->lchild;
if(p == NULL) break;
top ++;
stack[top] = p;
}
if(top >= 0) {
p = stack[top];
top --;
putchar(p->ch);
p = p->rchild;
top ++;
stack[top] = p;
}
}
}
/*二叉树非递归中序遍历*/
void InOrder3(BiTree T) {
BiTree p;
BiTree stack[SIZE];
int top = -1;
p = T;
while(top >= 0 || p != NULL) {
if(p != NULL) {
top ++;
stack[top] = p;
p = p->lchild;
}
else {
p = stack[top];
top --;
putchar(p->ch);
p = p->rchild;
}
}
}
/*二叉树的递归后序遍历*/
void PostOrder(BiTree T) {
if(T != NULL) {
PostOrder(T->lchild);
PostOrder(T->rchild);
putchar(T->ch);
}
}
void main() {
BiTree T;
CreatTree(T);
/
PreOrder1(T);
printf("\n");
/
PreOrder2(T);
printf("\n\n");
//
InOrder1(T);
printf("\n");
/
InOrder2(T);
printf("\n");
/
InOrder3(T);
printf("\n\n");
/
PostOrder(T);
printf("\n");
}