给出两个字符串,分别表示二叉树的先序遍历(根、左子树、右子树)和中序遍历(左子树、根、右子树)的结果。
例如,对于下面的二叉树,先序遍历结果是DBACEGF,中序遍历结果是ABCDEFG。
假定二叉树的每个节点都用大写的字母标识,且对于同一棵二叉树,同一个字母不会用两次。现在请你根据给出的先序遍历和中序遍历,重构这棵二叉树。
输入格式:
输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行先序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。
输出格式:
将每个测试用例转化为一棵二叉树,并在一行中输出树的后序遍历(左子树、右子树、根)的结果。
输入样例:
DBACEGF ABCDEFG
BCAD CBAD
结尾无空行
输出样例:
ACBFGED
CDAB
代码如下:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct TNode *Tree;
typedef struct TNode{
char data;
Tree left;
Tree right;
}BinTree;
void PostorderTraversal( Tree BT );
Tree Chonggou(char *x,char *y,int p);
int main()
{
char a[30],b[30];
while(~scanf("%s %s",a,b))
{
Tree T;
T=Chonggou(a,b,strlen(b));
PostorderTraversal(T);
printf("\n");
}
return 0;
}
Tree Chonggou(char *x,char *y,int p)
{
Tree T;
for(int i=0;i<p;i++)
if(x[0]==y[i])
{
T=(Tree)malloc(sizeof(BinTree));
T->data=x[0];
T->left=Chonggou(x+1,y,i);
T->right=Chonggou(x+i+1,y+i+1,p-i-1);
return T;
}
return NULL;
}
void PostorderTraversal( Tree BT )
{
if(BT)
{
PostorderTraversal(BT->left);
PostorderTraversal(BT->right);
printf("%c",BT->data);
}
}