思路:
根据两个序列遍历这颗树,有左子树就遍历左子树,没有左子树就遍历右子树,找到的第一个叶子结点即题目所求的结点;
代码:
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
vector<int> order[2];
unordered_map<int,int> mp;
bool flag=true;
void findN(int prebgn,int preend,int inbgn,int inend){
int root=order[0][prebgn];
if(prebgn==preend){
printf("%d",order[0][prebgn]);
flag=false;
}
if(mp[root]!=inbgn&&flag)
findN(prebgn+1,mp[root]-inbgn+prebgn,inbgn,mp[root]-1);
else if(flag)
findN(prebgn+1,preend,inbgn+1,inend);
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<2;i++){
order[i].resize(n);
for(int j=0;j<n;j++){
scanf("%d",&order[i][j]);
if(i==1) mp[order[i][j]]=j;
}
}
findN(0,n-1,0,n-1);
return 0;
}