##已知二叉树的前序遍历和中序遍历,求出它的后序遍历
由于二叉树的前序遍历的首字母即是它的根节点,然后是左子树,最后是右子树,中序遍历的根节点又处于左子树和右子树之间,所以可以将中序遍历的每一个元素与前序遍历的首元素(即根节点)进行比较,当他们相等时,中序遍历就被分为了两个区间,然后根据中序遍历左边的区间长度和右边的长度,将前序遍历分为两个区间,再分别对左边的前序遍历和左边的中序遍历,右边的前序遍历和右边的中序遍历进行递归处理。

举个例子:
长度为8
前序遍历为 GDAFEMHZ,记为数组pre
中序遍历为 ADEFGHMZ,记为数组mid
由于mid[4]==pre[0]
所以中序遍历被mid[4]分为了 ADEF 和 HMZ
所以对应的前序遍历被分为了 GDAF 和 MHZ
即这棵树的根节点为pre[0]
左子树的前序遍历为 ADEF,中序遍历为 GDAF
左子树的前序遍历为 HMZ,中序遍历为 MHZ
然后对两边递归就行了

##看完了的话,不妨在纸上试试画出这个二叉树来,可以加深自己的印象哦。

具体实现看代码

/*
8
GDAFEMHZ
ADEFGHMZ
* 
AEFDHZMG
*/
#include<iostream>
#include<cstring>
using namespace std;
void binarytree(char a[],char b[],int len)
{
	int i;
	if (len==0)
	return ;
	for (i=0;i<len;i++)
	{
		if (b[i]==*a)
		break;
	}
	binarytree(a+1,b,i);
	binarytree(a+i+1,b+i+1,len-i-1);
	cout<<a[0];
}
int main()
{
	int n;
	cin>>n;
	char pre[n],mid[n];
	scanf("%s %s",pre,mid);
	binarytree(pre,mid,n);
}