根据严蔚敏教材第130页的算法而来,可直接运行,在VC6中调试通过.
#include
<
stdio.h
>
#include < process.h >
#include < stdarg.h >
#include < stdlib.h >
#include < malloc.h >
#define NULL 0
#define MAXNODE 100
#define OVERFLOW - 2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR - 1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
Status PrintElement(TElemType e)
{
printf( " %c " ,e);
return OK;
}
Status NewTree(BiTree & T)
{
T = (BiTree)malloc(sizeof(BiTNode));T -> data = ' #';
T -> lchild = NULL ;
T -> rchild = NULL ;
return OK;
}
Status CreateBiTree(BiTree & T)
{
TElemType ch;
scanf( " %c " , & ch);
if (ch == ' #') T=NULL;
else
{
if (!(T = (BiTNode * )malloc(sizeof(BiTNode))))
return(OVERFLOW);
T -> data = ch;
printf( " CreateBiTree succeed at %c " ,ch);
CreateBiTree(T -> lchild);
CreateBiTree(T -> rchild);
}
return OK;
} // CreateBiTree
Status PreOrderTraverse(BiTree T,Status( * Visit)(TElemType e))
{
if (T)
{
if (Visit(T -> data))
if (PreOrderTraverse(T -> lchild,Visit))
if (PreOrderTraverse(T -> rchild,Visit))
return OK;
return ERROR ;
}
return OK;
}
Status InOrderTraverse(BiTree T,Status( * Visit)(TElemType e))
{
if (T)
{
if (InOrderTraverse(T -> lchild,Visit))
if (Visit(T -> data))
if (InOrderTraverse(T -> rchild,Visit))
return(OK);
return( ERROR );
}
return OK;
}
Status PostOrderTraverse(BiTree T,Status( * Visit)(TElemType e))
{
if (T)
{
if (PostOrderTraverse(T -> lchild,Visit))
if (PostOrderTraverse(T -> rchild,Visit))
if (Visit(T -> data))
return OK;
return ERROR ;
}
return OK;
}
int main()
{
BiTree T,S;
NewTree(T);
CreateBiTree(T);
printf( " CreateBiTree Succeed! " );
PreOrderTraverse(T,PrintElement);printf( " PreOrderTraverse Complete. " );
InOrderTraverse(T,PrintElement);printf( " InOrderTraverse Complete. " );
PostOrderTraverse(T,PrintElement);printf( " PostOrderTraverse Complete. " );
return 1 ;
}
/* 运行结果:输入
-+ a## * b## - c##d## / e##f##
CreateBiTree succeed at -
CreateBiTree succeed at +
CreateBiTree succeed at a
CreateBiTree succeed at *
CreateBiTree succeed at b
CreateBiTree succeed at -
CreateBiTree succeed at c
CreateBiTree succeed at d
CreateBiTree succeed at /
CreateBiTree succeed at e
CreateBiTree succeed at f
CreateBiTree Succeed!
- + a * b - c d / e fPreOrderTraverse Complete.
a + b * c - d - e / fInOrderTraverse Complete.
a b c d - * + e f / - PostOrderTraverse Complete.
Press any key to continue */
#include < process.h >
#include < stdarg.h >
#include < stdlib.h >
#include < malloc.h >
#define NULL 0
#define MAXNODE 100
#define OVERFLOW - 2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR - 1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
Status PrintElement(TElemType e)
{
printf( " %c " ,e);
return OK;
}
Status NewTree(BiTree & T)
{
T = (BiTree)malloc(sizeof(BiTNode));T -> data = ' #';
T -> lchild = NULL ;
T -> rchild = NULL ;
return OK;
}
Status CreateBiTree(BiTree & T)
{
TElemType ch;
scanf( " %c " , & ch);
if (ch == ' #') T=NULL;
else
{
if (!(T = (BiTNode * )malloc(sizeof(BiTNode))))
return(OVERFLOW);
T -> data = ch;
printf( " CreateBiTree succeed at %c " ,ch);
CreateBiTree(T -> lchild);
CreateBiTree(T -> rchild);
}
return OK;
} // CreateBiTree
Status PreOrderTraverse(BiTree T,Status( * Visit)(TElemType e))
{
if (T)
{
if (Visit(T -> data))
if (PreOrderTraverse(T -> lchild,Visit))
if (PreOrderTraverse(T -> rchild,Visit))
return OK;
return ERROR ;
}
return OK;
}
Status InOrderTraverse(BiTree T,Status( * Visit)(TElemType e))
{
if (T)
{
if (InOrderTraverse(T -> lchild,Visit))
if (Visit(T -> data))
if (InOrderTraverse(T -> rchild,Visit))
return(OK);
return( ERROR );
}
return OK;
}
Status PostOrderTraverse(BiTree T,Status( * Visit)(TElemType e))
{
if (T)
{
if (PostOrderTraverse(T -> lchild,Visit))
if (PostOrderTraverse(T -> rchild,Visit))
if (Visit(T -> data))
return OK;
return ERROR ;
}
return OK;
}
int main()
{
BiTree T,S;
NewTree(T);
CreateBiTree(T);
printf( " CreateBiTree Succeed! " );
PreOrderTraverse(T,PrintElement);printf( " PreOrderTraverse Complete. " );
InOrderTraverse(T,PrintElement);printf( " InOrderTraverse Complete. " );
PostOrderTraverse(T,PrintElement);printf( " PostOrderTraverse Complete. " );
return 1 ;
}
/* 运行结果:输入
-+ a## * b## - c##d## / e##f##
CreateBiTree succeed at -
CreateBiTree succeed at +
CreateBiTree succeed at a
CreateBiTree succeed at *
CreateBiTree succeed at b
CreateBiTree succeed at -
CreateBiTree succeed at c
CreateBiTree succeed at d
CreateBiTree succeed at /
CreateBiTree succeed at e
CreateBiTree succeed at f
CreateBiTree Succeed!
- + a * b - c d / e fPreOrderTraverse Complete.
a + b * c - d - e / fInOrderTraverse Complete.
a b c d - * + e f / - PostOrderTraverse Complete.
Press any key to continue */