PAT甲级 1138 - Postorder Traversal

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr0cheng/article/details/79367583
  1. 根据中序和前序序列建树
  2. 递归回溯时第一个节点即为后序访问的第一个节点
#include<bits/stdc++.h>
using namespace std;
const int maxn=50000+10;
bool flag=false;
int ans;
int inOrder[maxn],preOrder[maxn];
void dfs(int preL,int preR,int inL,int inR){
    if(preL>preR || inL>inR)return;
    int i;
    for(i=inL;i<=inR;++i){
        if(inOrder[i]==preOrder[preL]){
            break;
        }
    }
    dfs(preL+1,preL+i-inL,inL,i-1);
    dfs(preR+i+1-inR,preR,i+1,inR);
    if(!flag){
        flag=true;
        ans=i;
    }
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",preOrder+i);
    }
    for(int i=1;i<=n;++i){
        scanf("%d",inOrder+i);
    }
    dfs(1,n,1,n);
    printf("%d",inOrder[ans]);
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/Mr0cheng/article/details/79367583