题目链接:PAT【甲级】1138
题目简述:给定一个正整数N(<=50000),又给出一棵树的前序和中序遍历序列。序列均由正整数构成。问这棵树的后序遍历序列的第一个节点值是多少。
#include<bits/stdc++.h>
using namespace std;
unordered_map<int, int> indice;//记录前序序列中出现的数字在中序序列中的位置
int ans;
void getAns(vector<int>& pre, vector<int>& in, int pivot, int inl, int inh){
if(inl == inh){
ans = in[inl];
return;
}
int pos = indice[pre[pivot]];
if(pos > inl)
getAns(pre, in, pivot + 1, inl, pos - 1);
else
getAns(pre, in, pivot + 1, inl + 1, inh);
}
int main(){
int n;
cin >> n;
vector<int> pre(n), in(n);
for (int i = 0; i < n;i++)
cin >> pre[i];
for (int i = 0; i < n;i++){
cin >> in[i];
indice[in[i]] = i;
}
getAns(pre, in, 0, 0, n - 1);
cout << ans;
return 0;
}
这个题目和1143、1151
还是比较接近的,而且较之两者要简单一些。就是去遍历就行了,由于它只需要输出后序遍历序列的第一个节点值,且后序遍历时左右根
,那便简单了。我们依据前序遍历序列来找出根
在中序中的位置,然后看左边有没有节点,有的话就将问题转化到左子树,没有的话那就是右子树。递归的边界是,区间内只剩下一个节点。