此代码可以正常运行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char TElemType;
#define N 100
typedef struct BiNode
{
TElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
enum Status{ERROR,OK};
BiTree Create(int n, TElemType *pre, TElemType *mid)///前序中序建立二叉树
{
if(n==0)
return NULL;
BiTree T;
T = (BiNode *)malloc(sizeof(BiNode));
T->data = pre[0];
T->lchild=T->rchild=NULL; //第一个结点为根
int i;
for(i=0;i<n;i++)
if(pre[0] == mid[i])
break;
T->lchild = Create(i, pre+1,mid);
T->rchild = Create(n-i-1, pre+i+1, mid+i+1);
return T;
}
Status PostOrder(BiTree T) //后序
{
if(T==NULL)
return OK;
else
{
PostOrder(T->lchild); //递归遍历左子树
PostOrder(T->rchild); //递归遍历右子树
printf("%c ",T->data); //访问根节点
}
}
//如果去掉输出语句,从递归的角度看,三种算法是完全相同的,
//或说这三种算法的访问路径是相同的,只是访问结点的时机不同。
//输出根的顺序不同
//时间效率:O(n) :每个结点只访问一次
//空间效率: O(n):栈占用的最大辅助空
int main()
{
TElemType preNode[N];
TElemType midNode[N];
int n = 0;
TElemType ch;
BiTree bt=NULL;
printf("请输入前序序列\n");
while((ch = getchar())!='\n')
preNode[n++] = ch;
printf("请输入中序序列\n");
n = 0;
while((ch = getchar())!='\n')
midNode[n++] = ch;
bt= Create(n,preNode,midNode); //n为元素个数
printf("后序序列遍历结果\n");
PostOrder(bt);
return 0;
}