#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int SElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
int flag = 0;
typedef char TelemType;
typedef int Status;
typedef struct BiTNode
{
TelemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
Status visit(TelemType e)
{
printf("%c",e);
return OK;
}
Status CreateBiTree(BiTree &T)
{
//按先序次序输入二叉树中结点的值,空格表示空树
//生成二叉树的二叉链表存储结构,T为根结点指针
char ch;
scanf("%c",&ch);
if (ch==' ')
T=NULL;
else
{
if (!(T=(BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch; //建立根结点
CreateBiTree( T->lchild); //建立左子树
CreateBiTree(T->rchild); //建立右子树
}
return OK;
} //CreateBiTree
Status PrintElement(TelemType e)
{
printf("%c",e); //输出元素值
return OK;
}
Status PreorderTraverse(BiTree T, Status(*visit)(TelemType e))
{
//先序遍历根结点指针为T的二叉树
if (T)
{
if (visit(T->data))
if (PreorderTraverse(T->lchild,visit))
if (PreorderTraverse(T->rchild,visit)) return OK;
return ERROR;
}
else return OK; //if (T)
}//PreorderTraverse
Status InorderTraverse1(BiTree T, Status(*visit)(TelemType e))
{
//先序遍历根结点指针为T的二叉树
if (T)
{
if (InorderTraverse1(T->lchild,visit))
if (visit(T->data))
if (InorderTraverse1(T->rchild,visit)) return OK;
return ERROR;
}
else return OK; //if (T)
}//InorderTraverse
Status PostorderTraverse(BiTree T, Status(*visit)(TelemType e))
{
//后序遍历根结点指针为T的二叉树
if (T)
{
if (PostorderTraverse(T->lchild,visit))
if (PostorderTraverse(T->rchild,visit))
if (visit(T->data)) return OK;
return ERROR;
}
else return OK; //if (T)
}//PostorderTraverse
void free_bitree(BiTree *bt)
{
if (*bt) {
if ((*bt)->lchild)
free_bitree(&(*bt)->lchild);
if ((*bt)->rchild)
free_bitree(&(*bt)->rchild);
free(*bt);
*bt = NULL;
}
}
int main()
{
BiTree T;
printf("please iput characters to create a tree\n");
CreateBiTree(T);
printf("preorder traverse the tree\n");
PreorderTraverse(T,*visit);
printf("\n");
printf("inorder traverse the tree:digui\n");
InorderTraverse1(T, *visit);
printf("\n");
printf("postorder traverse the tree\n");
PostorderTraverse(T,*visit);
printf("\n");
free_bitree(&T);//释放二叉树;
return 0;
}
二叉树的非递归遍历就不写了,用到链栈跟队列,很麻烦