因为数组可能过大而且我们只需要输出第一个,所以我们可以截取左边的部分,后面的就不用考虑了(注意根只有右孩子的情况,可以把根舍去,把原根的右孩子作为根)
#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> pre, in;
bool flag;
void travel(int ps,int pe,int is,int ie) {
if (ps > pe)return;
if (ps == pe) {
if (!flag) {
cout << pre[ps];
flag = true;
}
return;
}
int i = 0;
while (pre[ps] != in[is + i])i++;
travel(ps+1,ps+i,is,is+i-1);
travel(ps+i+1,pe,is+i+1,ie);
}
int main() {
cin >> n;
pre.resize(n);
in.resize(n);
for (int i = 0; i < n; i++) scanf("%d",&pre[i]);
int j = 0;
for (; j < n; j++) {
scanf("%d", &in[j]);
if (in[j] == pre[0]) {
if (j == 0) {
n--; j--;
continue;
}
break;
}
}
travel(1,j,0,j-1);
return 0;
}