主要是怎么寻找到根结点 根据根节点的位置去判断 还是挺难的 希望明天考试加油
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10010;
int pre[MAXN];
int in[MAXN];
map<int,int> mp;
void lca(int inl,int inr,int prel,int a,int b)
{
if(inl > inr)
{
return ;
}
int k = mp[pre[prel]];
int numleft = k - inl;
if((k > mp[a] && k < mp[b]) || (k > mp[b] && k < mp[a]))
{
printf("LCA of %d and %d is %d.\n",a,b,in[k]);
}
else if(k == mp[a])
{
printf("%d is an ancestor of %d.\n",a,b);
}
else if(k == mp[b])
{
printf("%d is an ancestor of %d.\n",b,a);
}
else if(k > mp[a] && k > mp[b])
{
lca(inl,k - 1,prel + 1,a,b);
}
else
{
lca(k + 1,inr,prel + numleft + 1,a,b);
}
}
int main(void)
{
freopen("pat0314/in.txt","r",stdin);
int m,n;
cin>>m>>n;
for(int i = 1;i<=n;i++)
{
cin>>in[i];
mp[in[i]] = i;
}
for(int i = 1;i<=n;i++)
{
cin>>pre[i];
}
for(int i = 0;i<m;i++)
{
int l,r;
cin>>l>>r;
if(mp[l] == 0 && mp[r] != 0)
{
printf("ERROR: %d is not found.\n",l);
continue;
}
else if(mp[l] != 0 && mp[r] == 0)
{
printf("ERROR: %d is not found.\n",r);
continue;
}
else if(mp[l] == 0 && mp[r] == 0)
{
printf("ERROR: %d and %d are not found.\n",l,r);
continue;
}
else
{
lca(1,n,1,l,r);
}
}
return 0;
}