#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N=10000;
struct tree
{
char dat;
int l,r;
}tr[N];
string pre,mid,fin;
int tot,now,t;
int rebuild(int l,int r)//已知先序中序建立二叉树
{
if(l>r)return 0;
int m;
for(int i=l;i<=r;i++)
{
if(pre[now]==mid[i])
{
m=i;
break;
}
}
tr[++tot].dat=pre[now++];
int root=tot;
tr[root].l=rebuild(l,m-1);//先建左子树
tr[root].r=rebuild(m+1,r);
return root;
}
int fibuild(int l,int r)//已知中序后序建立二叉树
{
if(l>r)return 0;
int m;
for(int i=l;i<=r;i++)
{
if(fin[now]==mid[i])
{
m=i;
break;
}
}
tr[++tot].dat=fin[now--];
int root=tot;
tr[root].r=fibuild(m+1,r);//先建右子树
tr[root].l=fibuild(l,m-1);
return root;
}
void finalprint(int root)
{
if(root)
{
cout<<tr[root].dat;
finalprint(tr[root].l);
finalprint(tr[root].r);
}
}
int main()
{
cin>>t;
while(t--)
{
cin>>mid>>fin;
tot=0;
now=fin.size()-1;//已知后续now需要从后向前
int root=fibuild(0,fin.size()-1);
finalprint(root);
cout<<endl;
}
return 0;
}
C - 求二叉树的先序遍历
最新推荐文章于 2024-06-16 18:27:54 发布