题目描述
知识点: 前序遍历,中序遍历
思路: 根据前序遍历以及中序遍历进行后序遍历。由于只需要输出第一个后序遍历的数字,所以可以进行剪枝,当遇到第一个叶子节点就将其输出然后进行剪枝return。
#include<iostream>
using namespace std;
const int N = 50010;
int n;
int pre[N],in[N];
bool is_exit = false;
void dfs(int root,int l,int r){
if(is_exit == true) return;
if(l > r) return;
if(l == r){
cout<<in[l];
is_exit = true;
return;
}
int u = pre[root];
int i = l;
while(in[i] != u) i++;
dfs(root+1,l,i-1);
dfs(root+i-l+1,i+1,r);
}
int main(){
cin>>n;
for(int i = 0;i < n;i++) cin>>pre[i];
for(int i = 0;i < n;i++) cin>>in[i];
dfs(0,0,n-1);
return 0;
}