假设二叉树上各结点的权值互不相同且都为正整数。
给定二叉树的前序遍历和中序遍历,请你输出二叉树的后序遍历的第一个数字。
输入格式
第一行包含整数 NN,表示二叉树结点总数。
第二行给出二叉树的前序遍历序列。
第三行给出二叉树的中序遍历序列。
输出格式
输出二叉树的后序遍历的第一个数字。
数据范围
1≤N≤500001≤N≤50000
输入样例:
7
1 2 3 4 5 6 7
2 3 1 5 4 7 6
输出样例:
3
#include <iostream>
#include <unordered_map>
using namespace std;
const int N=5e4+10;
int cnt,res[N];
unordered_map<int,int >l,r,pos;
int preorder[N],inorder[N];
int build(int pl,int pr,int il,int ir)
{
if(pl>pr) return 0;
int root=preorder[pl];
int k=pos[root];
if(il<k) l[root]= build(pl+1,pl+k-il,il,k-1);
if(ir>k) r[root]= build(pl+k-il+1,pr,k+1,ir);
return root;
}
void dfs(int u )
{
if(l[u]) dfs(l[u]);
if(r[u]) dfs(r[u]);
res[cnt++]=u;
if(cnt>=1) return ;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>preorder[i];
for(int i=0;i<n;i++) cin>>inorder[i],pos[inorder[i]]=i;
int root=build(0,n-1,0,n-1);
dfs(root);
cout<<res[0];
}