题目大意:
给俩字符串,precord的顺序(root, left subtree, right subtree),incord的顺序(left subtree, root, right subtree)。
然后求(left subtree, right subtree, root)。
思路:
原本自己想到的是可以每次按头结点分割,因为precord的第一个字符永远是最上结点。
这样以最上结点在incord中的位置前后分割,左边树和右边树的长度和数值都清楚了。
可以分下去得到从上到下从左到右的所有结点。
这里思路都很顺,然后就死了。
因为不晓得怎么把能得到的这些结点转成左右上的顺序。
见到那关键一步对愚蠢的我而言很难想到,左右上就是上右左倒过来啊。
以上右左的顺序dfs,用个stack存得到的输出就可以了。
感觉还没有入二叉树的门。懵懵懂懂但是一次就过了。
/*
uva 536 Tree Recovery dfs by zhuhua
Time limit: 3000ms
AC time: 0ms???
*/
#include <iostream>
#include <stack>
using namespace std;
string precord,incord;
stack <char> ReOut;
void dfs(string a,string b)
{
if(a=="")return;
char head=a[0];
ReOut.push(head);
int pos=b.find(head,0);
//cout<<head<<endl;
string lefta,leftb,righta,rightb;
righta=a.substr(pos+1,a.length()-pos-1);
rightb=b.substr(pos+1,b.length()-pos-1);
//cout<<righta<<" "<<rightb<<endl;
dfs(righta,rightb);
lefta=a.substr(1,pos);
leftb=b.substr(0,pos);
dfs(lefta,leftb);
}
int main()
{
while(cin>>precord>>incord)
//pre:root,left,right
//in:left,root,right
{
dfs(precord,incord);
while(!ReOut.empty())
{
cout<<ReOut.top();
ReOut.pop();
}cout<<endl;
}
return 0;
}