PAT甲级1151 利用共同父节点的通用性质进行判断
如果c是a和b的共同父节点,那么一定满足,1.c的中序遍历下标在a与b的中间,即
2.c是从上到下发现的第一个符合该点的数
所以思路为:利用前序遍历和1中序遍历得到层序遍历,然后遍历层序数组,第一个满足上述表达式的极为所求。
#include <iostream>
#include <map>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int pre[10010],in[10010];
int m,n;
vector<int> lay;
map<int,int> mp,findIn;
void buildTree(int prel,int prer,int inl,int inr){
if(prel>prer)
return;
int first=pre[prel];
int i=inl;
for(;i<inr;i++){
if(in[i]==first)
break;
}
int num=i-inl;
lay.push_back(first);
buildTree(prel+1,prel+num,inl,i-1);
buildTree(prel+num+1,prer,i,inr);
}
int main(){
cin>>m>>n;
for(int i=0;i<n;i++){
cin>>in[i];
mp[in[i]]=1;
findIn[in[i]]=i;
}
for(int i=0;i<n;i++)
cin>>pre[i];
buildTree(0,n-1,0,n-1);
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
if(mp[a]==0&&mp[b]==0)
cout<<"ERROR: "<<a<<" and "<<b<<" are not found."<<endl;
else if(mp[a]==0)
cout<<"ERROR: "<<a<<" is not found."<<endl;
else if(mp[b]==0)
cout<<"ERROR: "<<b<<" is not found."<<endl;
else{
for(int i=0;i<n;i++){
int indexa=findIn[a],indexb=findIn[b],index=findIn[lay[i]];
if((index>=indexa&&index<=indexb)||(index>=indexb&&index<=indexa)){
if(index==indexa)
cout<<a<<" is an ancestor of "<<b<<"."<<endl;
else if(index==indexb)
cout<<b<<" is an ancestor of "<<a<<"."<<endl;
else
cout<<"LCA of "<<a<<" and "<<b<<" is "<<lay[i]<<"."<<endl;
break;
}
}
}
}
return 0;
}