题目
POJ - 2255 前中求后
nyoj -756 后中求前
先说一下二叉树遍历
先序遍历二叉树:先序遍历根节点,先序遍历左子树,先序遍历右子树,也就是NLR
中序遍历二叉树:中序遍历左子树,中序遍历根节点,中序遍历右子树,也就是LNR
后序遍历二叉树:后序遍历左子树,后序遍历右子树,后序遍历根节点,也就是LRN
后序序列:ACBFGED
中序序列:ABCDEFG
首先确定D是整个二叉树的根节点,然后在中序序列中找到D则其左边的ABC就是D的左子树,EFG就是 D的右子树。
提取出左字数的后序和中序序列
后序序列:ACB
中序序列: ABC
后序序列的最后一个字符是B则B是当前子树的根节点,然后在中序序列中找到B则左边的A是B的左子树,C是B的右子树。
以此递推就可以得到整个二叉树的结构了,如下图所示
#include<iostream>
#include<cstring>
using namespace std;
char s3[30];
int o=0;
void hou(char s1[],char s2[],int n) //n记录了左右子树的长度
{
if(n<=0) return;
int m=strchr(s2,s1[0])-s2;
//左子树
hou(s1+1,s2,m);
//右子树
hou(s1+m+1,s2+m+1,n-m-1);
s3[o++]=s1[0];
}
void qian(char s1[],char s2[],int n)
{
if(n<=0) return;
int m=strchr(s2,s1[n-1])-s2;
s3[o++]=s1[n-1];
//左
qian(s1,s2,m);
//右
qian(s1+m,s2+m+1,n-m-1);
}
int main()
{
char s1[30],s2[30];
while(cin>>s1>>s2)
{
int len=strlen(s1);
o=0;
// 前中求后
// hou(s1,s2,len);
//后中求前
qian(s1,s2,len);
for(int i=0;i<len;i++)
cout<<s3[i];
cout<<endl;
}
return 0;
}