#include <stdio.h>
#include <string.h>
#define TElemType int
int top = -1;
int front = 0, rear = 0;
typedef struct BiTNode {
TElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode,*BiTree;
void createBiTree(BiTree *T) {
*T = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->data = 1;
(*T)->lchild = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->rchild = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->lchild->data = 2;
(*T)->lchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->lchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->lchild->rchild->data = 5;
(*T)->lchild->rchild->lchild = NULL;
(*T)->lchild->rchild->rchild = NULL;
(*T)->rchild->data = 3;
(*T)->rchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->rchild->lchild->data = 6;
(*T)->rchild->lchild->lchild = NULL;
(*T)->rchild->lchild->rchild = NULL;
(*T)->rchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->rchild->rchild->data = 7;
(*T)->rchild->rchild->lchild = NULL;
(*T)->rchild->rchild->rchild = NULL;
(*T)->lchild->lchild->data = 4;
(*T)->lchild->lchild->lchild = NULL;
(*T)->lchild->lchild->rchild = NULL;
}
void displayElem(BiTNode* elem) {
printf("%d ", elem->data);
}
void push(BiTNode** a, BiTNode* elem) {
a[++top] = elem;
}
void pop() {
if (top == -1) {
return;
}
top --;
}
void enQueue(BiTree *a, BiTree node) {
a[rear++] = node;
}
BiTNode* deQueue(BiTNode** a) {
return a[front++];
}
BiTNode* getTop(BiTNode**a) {
return a[top];
}
void preOrderTraverse1(BiTree T) {
if (T) {
displayElem(T);
preOrderTraverse1(T->lchild);
preOrderTraverse1(T->rchild);
}
return;
}
void inOrderTraverse1(BiTree T) {
if (T) {
inOrderTraverse1(T->lchild);
displayElem(T);
inOrderTraverse1(T->rchild);
}
return;
}
void postOrderTraverse1(BiTree T) {
if (T) {
postOrderTraverse1(T->lchild);
postOrderTraverse1(T->rchild);
displayElem(T);
}
return;
}
void preOrderTraverse2(BiTree T) {
BiTNode* a[20];
BiTNode* p;
push(a, T);
while (top != -1) {
p = getTop(a);
pop();
while (p) {
displayElem(p);
if (p->rchild) {
push(a, p->rchild);
}
p = p->lchild;
}
}
}
void inOrderTraverse2(BiTree T) {
BiTNode* a[20];
BiTNode * p;
push(a, T);
while (top != -1) {
while ((p = getTop(a)) && p) {
push(a, p->lchild);
}
pop();
if (top != -1){
p = getTop(a);
pop();
displayElem(p);
push(a, p->rchild);
}
}
}
void inOrderTraverse3(BiTree T) {
BiTNode* a[20];
BiTNode * p;
p = T;
while (p || top != -1) {
if (p) {
push(a, p);
p = p->lchild;
}
else {
p = getTop(a);
pop();
displayElem(p);
p = p->rchild;
}
}
}
typedef struct SNode {
BiTree p;
int tag;
}SNode;
void postPush(SNode *a, SNode sdata) {
a[++top] = sdata;
}
void postOrderTraverse2(BiTree T) {
SNode a[20];
BiTNode * p;
int tag;
SNode sdata;
p = T;
while (p || top != -1){
while (p) {
sdata.p = p;
sdata.tag = 0;
postPush(a, sdata);
p = p->lchild;
}
sdata = a[top];
pop();
p = sdata.p;
tag = sdata.tag;
if (tag == 0) {
sdata.p = p;
sdata.tag = 1;
postPush(a, sdata);
p = p->rchild;
}
else {
displayElem(p);
p = NULL;
}
}
}
void levelTraverse(BiTree T) {
BiTNode* p;
BiTree a[20];
enQueue(a, T);
while (front < rear) {
p = deQueue(a);
displayElem(p);
if (p->lchild != NULL) {
enQueue(a, p->lchild);
}
if (p->rchild != NULL) {
enQueue(a, p->rchild);
}
}
return 0;
}
int main() {
BiTree tree;
createBiTree(&tree);
printf("\n先序遍历递归:\n");
preOrderTraverse1(tree);
printf("\n先序非遍历递归:\n");
preOrderTraverse2(tree);
printf("\n中序递归遍历:\n");
inOrderTraverse1(tree);
printf("\n中序非递归遍历1:\n");
inOrderTraverse2(tree);
printf("\n中序非递归遍历2:\n");
inOrderTraverse3(tree);
printf("\n后序递归遍历:\n");
postOrderTraverse1(tree);
printf("\n后序非递归遍历:\n");
postOrderTraverse2(tree);
printf("\n层次遍历:\n");
levelTraverse(tree);
}