POJ 2255 Tree Recovery
重建二叉树
给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。
输入输入可能有多组,以EOF结束。
每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。输出对于每组输入,用一行来输出它后序遍历结果。样例输入
DBACEGF ABCDEFG BCAD CBAD
样例输出
ACBFGED CDAB
#include<stdio.h>
#include<iostream>
#include<string.h>
#define maxn 1001
using namespace std;
char s1[maxn],s2[maxn];
int fa=0,root,n1,n2,step=0,father[maxn],chilrd[maxn][2];
int search(int l,int r,char v)
{
for(int i=l;i<=r;i++)
if(s2[i]==v) return i;
return -1;
}
void jianshu(int l,int r,int me)
{ if(me==-1) {step--;return;}
chilrd[me][0]=search(l,me,s1[++step]);//printf("%d %d %d %d<-->%d\n",l,r,me,step,chilrd[me][0]);
jianshu(l,me,chilrd[me][0]);
chilrd[me][1]=search(me,r,s1[++step]);//printf("%d %d %d %d>-->%d\n",l,r,me,step,chilrd[me][1]);
jianshu(me,r,chilrd[me][1]);
}
void dfs(int mt)
{
for(int i=0;i<=1;i++)
if(chilrd[mt][i]!=-1)
dfs(chilrd[mt][i]);
printf("%c",s2[mt]);
}
int main()
{
while(scanf("%s %s",s1,s2)!=EOF)
{
n1=strlen(s1);n2=strlen(s2);
root=search(0,n2-1,s1[0]);
jianshu(0,n2-1,root);
/*for(int i=0;i<n2;i++)
{
printf("%d %d %d\n",i,chilrd[i][0],chilrd[i][1]);
}*/
dfs(root);
step=0;
printf("\n");
}
return 0;
}
考查二叉树的遍历
思路:通过先序中序找出每个点的子节点,再递归后序输出
***:输入需要用EOF输入