给了先序遍历和中序遍历,问后序遍历的第一个值。
注意运行时间,同样的代码之前没问题但是重新运行一遍居然运行超时了。
改成提前退出递归,改成scanf printf
#include<bits/stdc++.h>
using namespace std;
const int maxn=50500;
int pre[maxn],ino[maxn];
int ans=0;
bool flag=false;
void getpostFirst(int lp,int rp,int li,int ri,int length){
if(length<=0||flag){
return;
}
if(ans==0&&length==1){
ans=pre[lp];flag=true;
}
int root=pre[lp];
int j;
for(j=li;j<ri&&ino[j]!=root;j++);
int l=j-li;int r=ri-j;
//左
getpostFirst(lp+1,lp+l,li,j-1,l);
//右
getpostFirst(rp-r+1,rp,j+1,ri,r);
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&pre[i]);
for(int i=0;i<n;i++) scanf("%d",&ino[i]);
getpostFirst(0,n-1,0,n-1,n);
printf("%d",ans);
return 0;
}