又一道二叉树的题,给你中序和前序,然后再给二叉树做一个镜面反转,层次输出。
看着和遍历二叉树那道题目的结构很相似,递归结构中,搭配while循环找数。
最后的输出方式注意一下,ceng数组中存放的是树的原来的位置,也就是2*u和2*u+1的位置,使用vector把这种性质转换为层次顺序输出。
递归f(l + 1, l + x -i, i, x - 1, 2 * u + 1);
f(l + x - i + 1, r, x + 1, j, 2 * u);
其中,递归中每一个值都依据二叉树递归定义得出。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int pre[N],in[N],ceng[N],n;
vector<int>v;
void f(int l,int r,int i,int j,int u)
{
if(l>r||i>j) return;
ceng[u] = pre[l];
int x = i;
while(x<=j&&in[x]!=pre[l]) x++;
f(l+1,l+x-i,i,x-1,2*u+1);
f(l+x-i+1,r,x+1,j,2*u);
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++) cin >> in[i];
for(int i=1;i<=n;i++) cin >> pre[i];
f(1,n,1,n,1);
for(int i=1;i<N;i++)
if(ceng[i]!=0) v.push_back(ceng[i]);
for(int i=0;i<v.size();i++)
{
cout << v[i];
if(i!=v.size()-1) cout << " ";
}
return 0;
}