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