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