题意:给出一个二叉树的先序遍历,再给出中序遍历,求其后序遍历。
思路:先构造出其原来的二叉树,再后序输出即可。
体会:以前做过这个题,但是是直接解决的。没有构造出原有的二叉树,比较复杂。
今天看到编程之美里有这个题,就来写了一下,这样思路更清晰。
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct tree
{
struct tree *left,*right;
char value;
};
void rebuild(string a,string b,tree **r)
{
if (!a.size() || !b.size())
return;
tree *cur=new tree;
*r=cur;
cur->value=a[0];
cur->left=NULL;
cur->right=NULL;
string aa,bb;
int i=0;
while (i<a.size() && a[0]!=b[i])
bb.push_back(b[i]),aa.push_back(a[i+1]),i++;
rebuild(aa,bb,&(cur->left));
aa.clear(),bb.clear();
while (++i<a.size())
aa.push_back(a[i]),bb.push_back(b[i]);
rebuild(aa,bb,&(cur->right));
}
void rput(tree *r)
{
if (r==NULL)
return;
rput(r->left);
rput(r->right);
cout<<r->value;
}
int main()
{
int i,j,k;
string a("abdcef");
string b("dbaecf");
tree *r=NULL;
while (cin>>a>>b)
{
rebuild(a,b,&r);
rput(r);
cout<<endl;
}
return 0;
}