直接上代码:
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct SqStack
{
BiTree data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &);
bool Push(SqStack &,BiTree);
bool Pop(SqStack &,BiTree&);
bool IsEmpty(SqStack);
void InitTree(BiTree &);
void Visit(BiTree);
void PreOrder(BiTree);
void InOrder(BiTree);
void PostOrder(BiTree);
void InOrder2(BiTree);
void PreOrder2(BiTree);
int main()
{
BiTree T;
InitTree(T);
printf("preorder:");
PreOrder(T);
printf("inorder:");
InOrder(T);
printf("postorder:");
PostOrder(T);
printf("非递归中序遍历:");
InOrder2(T);
printf("非递归先序遍历:");
PreOrder2(T);
system("pause");
return 0;
}
void InitTree(BiTree &T){
int data ;
scanf("%d", &data);
if (data!=0){
T = (BiTNode*)malloc(sizeof(BiTNode));
T->lchild = NULL;
T->rchild = NULL;
T->data = data;
InitTree(T->lchild);
InitTree(T->rchild);
}
return;
}
void Visit(BiTree T) {
printf(" %d ", T->data);
}
void PreOrder(BiTree T)
{
if (T != NULL){
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T)
{
if (T != NULL){
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T) {
if (T != NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
}
void PreOrder2(BiTree T) {
if (T!=NULL){
SqStack S;
InitStack(S);
BiTree p = T;
while (p!=NULL || !IsEmpty(S)){
while (p != NULL){
Visit(p);
Push(S, p);
p = p->lchild;
}
if (!IsEmpty(S)){
Pop(S, p);
p = p->rchild;
}
}
}
}
void InOrder2(BiTree T) {
if (T!=NULL)
{
SqStack S;
InitStack(S);
BiTree p = T;
while (p!= NULL || !IsEmpty(S))
{
while(p!=NULL)
{
Push(S, p);
p = p->lchild;
}
if (!IsEmpty(S))
{
Pop(S, p);
Visit(p);
p = p->rchild;
}
}
}
}
void InitStack(SqStack &S) {
S.top = -1;
}
bool IsEmpty(SqStack S) {
return (S.top == -1) ? true : false;
}
bool Push(SqStack &S,BiTree data) {
if (S.top == MaxSize-1)
return false;
S.data[++S.top] = data;
return true;
}
bool Pop(SqStack &S, BiTree &data)
{
if (S.top == -1)
return false;
data = S.data[S.top--];
return true;
}