1.中前序推层序遍历
#include <bits/stdc++.h>
using namespace std;
const int maxn=50;
int mid[maxn],fr[maxn];
struct node{
int l,r;
}a[maxn];
int build(int la,int ra,int lb,int rb)//la,ra表示中序遍历 lb,rb表示前序遍历
{
if(la>ra)
return 0;//0代表这个树是空的
int rt=fr[lb],p1,p2;
p1=la;
while(mid[p1]!=rt) p1++;//在前序遍历中找到根节点
p2=p1-la;//左子树长度
a[rt].l=build(la,p1-1,lb+1,lb+p2);
a[rt].r=build(p1+1,ra,lb+p2+1,rb);
return rt;
}
void bfs(int x)//层序遍历
{
queue<int>q;
vector<int>v;
q.push(x);
while(!q.empty())
{
int w=q.front();
q.pop();
if(w==0)
break;
v.push_back(w);
if(a[w].r!=0)//倒着插入即为镜像
q.push(a[w].r);
if(a[w].l!=0)
q.push(a[w].l);
}
int len=v.size();
for(int i=0;i<len;i++)
printf("%d%c",v[i],i==len-1?'\n':' ');
return;
}
int main()
{
int n,i,j;
cin>>n;
for(i=0;i<n;i++) scanf("%d",&mid[i]);
for(i=0;i<n;i++) scanf("%d",&fr[i]);
build(0,n-1,0,n-1);
int root=fr[0];
bfs(root);
return 0;
}
2.中后序推层序遍历
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn=1e5+1;
struct node{
int l,r;
}tree[maxn];
int beh[maxn],mid[maxn];
int build(int la,int ra,int lb,int rb)
{
if(la>ra) return 0;
int rt=beh[rb];
int p1=la;
while(mid[p1]!=rt) p1++;
int p2=p1-la;
tree[rt].l=build(la,p1-1,lb,lb+p2-1);
tree[rt].r=build(p1+1,ra,lb+p2,rb-1);
return rt;
}
void bfs(int x)
{
vector<int>vec;
queue<int>que;
que.push(x);
while(!que.empty()){
int ret=que.front();
que.pop();
if(ret==0) break;
vec.push_back(ret);
if(tree[ret].l!=0)
que.push(tree[ret].l);
if(tree[ret].r!=0)
que.push(tree[ret].r);
}
for(int i=0;i<vec.size()-1;i++)
printf("%d ",vec[i]);
printf("%d\n",vec[vec.size()-1]);
}
void solve()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&beh[i]);
for(int i=1;i<=n;i++)
scanf("%d",&mid[i]);
build(1,n,1,n);
bfs(beh[n]);
}
int main()
{
/*
scanf("%lld\n",&T);
while(T--)
*/
solve();
return 0;
}