PAT 甲级 1138 Postorder Traversal (25 分)

思路:

根据两个序列遍历这颗树,有左子树就遍历左子树,没有左子树就遍历右子树,找到的第一个叶子结点即题目所求的结点;

代码:

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
vector<int> order[2];
unordered_map<int,int> mp;
bool flag=true;
void findN(int prebgn,int preend,int inbgn,int inend){
	int root=order[0][prebgn];
	if(prebgn==preend){
		printf("%d",order[0][prebgn]);
		flag=false;
	}
	if(mp[root]!=inbgn&&flag)
		findN(prebgn+1,mp[root]-inbgn+prebgn,inbgn,mp[root]-1);
	else if(flag)
		findN(prebgn+1,preend,inbgn+1,inend);
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<2;i++){
		order[i].resize(n);
		for(int j=0;j<n;j++){
			scanf("%d",&order[i][j]);
			if(i==1) mp[order[i][j]]=j;
		}
	}
	findN(0,n-1,0,n-1);	
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12309079.html